LINUX.ORG.RU

[Python][multiprocessing]Singleton для нескольких процессов

 ,


0

1

Приветствую.
Имеется некий объект, выполняющий роль объекта-одиночки (паттерн Singleton), который должен быть доступным для всех порождённых классов процессов (именно процессов, которые наследуются от multiprocessing.Process) и раздавать какие-либо данные (например выборки из БД и т.д.)
Собственно, как можно добиться действительно только одного объекта, который могут совместно использовать порождённые подпроцессы (и как они должны к нему обращаться, то есть, получать доступ к этому объекту и вызывать его методы), если допустим, что сам объект-провайдер данных (наш синглтон), создаётся в главном потоке (в принципе, не суть важно. где он будет создаваться). Причём, в данном случае, просто очередь multiprocessing.Queue()/JoinableQueue() не подойдут, так как пораждённый процесс сам должен решать, когда ему обратиться к этому объекту-провайдеру одиночке за новой порцией данных.

зы: синхронизация в самом синглтоне - это само-собой, не понятно как обеспечить его уникальность и доступность для всех подпроцессов, как к объекту?



Последнее исправление: xtesterx (всего исправлений: 1)

у меня один вопрос, все таки процессы или потоки?
Потому что _процессы_ обьект шарить между собой никак не могут, только обмениваться информацией через пайп/DBus/и т.д.

JFreeM ★★★☆
()

Да, есть подозрение, что ты хочешь сделать что-то не то. Опиши задачу подробнее. Может, просто пайпы заюзать для передачи данных? а может, XMLRPC например ? а может, мультипроцессы не нужны? или, может, достаточно шарить файловый дескриптор? а может и общей памятью обойтись можно. непонятно же что там у тебя.

mmarkk
()

Опиши не что есть, а что нужно. Пока складывается впечатление, что ты ССЗБ.

baverman ★★★
()

Не очень понятно, что ты хочешь получить, но зачем тебе синглтоны?
Не проще ли:
* запустилась программа
* подняла/запустила себе сервер
* пообщалась с ним по сокету
* погасила сервер
* завершила работу

???

Neksys ★★★
()

Делай межпроцессное общение на пайпах и очередях.

Подпроцесс шлёт в пайп название метода, главный процесс читает, исполняет и кладёт обратно результат. Ну или отдельную очередь для результатов организовать, не суть важно.

Дёргать методы в multiprocessing у тебя вряд ли получится по другому.

anonymous
()
Ответ на: комментарий от baverman

ок, всем спасибо, что приняли участие в обсуждении.
пока сделал посредством выноса объекта-провайдера данных (который синглтон) в отдельный независимый сервер-демон, который реализует свой сетевой протокол уровня приложения, то есть, немного более упрощённый xml-rpc, и к которому коннектятся порождённые процессы.
Зачем мне это нужно было - я не хотел что бы уровнем доступа к данным обладали и порождённые процессы, так как их основной задачей было только обрабатывать полученные данные из БД, и дальше согласно только своей задачи, а пораждать в каждом сабпроцессе объекты, которые работают с БД, и прочими слоями моего скрипта, имхо затратно и ресурсоёмко.
В общем, всем спасибо!

xtesterx
() автор топика
Ответ на: комментарий от anonymous

> Подпроцесс шлёт в пайп название метода, главный процесс читает, исполняет и кладёт обратно результат. Ну или отдельную очередь для результатов организовать, не суть важно.

с пайпами проблема в том, что в данном случае, нужно было реализовать модель «один ко многим», то есть, много (в среднем около 100) подпроцессов могут одновременно обращаться к объекту-провайдеру, и в таком случае, если происходит одновременная запись несколькими процессами в один конец пайпа, то данные на выходе могут быть повреждены; но и очереди (которые гарантируют лок) так же не подходят, так как время, затраченное на подготовку объектом-провайдером конечных данных, может достигать до 1-й минуты, и в таком случае, все подпроцессы будут ждать своей очереди, из-за чего, всё использование многопроцессорности сводится на нет, а вот отдельный локальный многопоточный сервер, к которому коннектятся подпроцессы, имхо, в данном случае, единственное приемлемое решение, в общем пока остановился на такой реализации.

xtesterx
() автор топика
Ответ на: комментарий от xtesterx

только обрабатывать полученные данные из БД, и дальше согласно только своей задачи

Почему не подошел Pool? Мастер процесс выбирает данные и скармливает их воркерам.

а пораждать в каждом сабпроцессе объекты, которые работают с БД, и прочими слоями моего скрипта, имхо затратно и ресурсоёмко.

Опять таки, что мешает сделать инициализацию один раз на достаточно долгоживущий воркер?

baverman ★★★
()
Ответ на: комментарий от baverman

>Гм. Чем это отличается от multiprocessing?

Так это, для мультипроцессинга как раз и предлагаю. Я про мультипроцессинговые пайпы.

anonymous
()
Ответ на: комментарий от baverman

там просто вёркеры динамически создаются - оканчивает работу один, сразу запускается второй, и добавляется в общий пул (который вот самостоятельно и реализовывал и оборачивал), без ожидания, пока все отработают. Новый запустившийся процесс, должен сам «просить» для себя задания и соответствующие данные, которые подготавливаются в разных частях системы

xtesterx
() автор топика
Ответ на: комментарий от xtesterx

>и в таком случае, если происходит одновременная запись несколькими процессами в один конец пайпа,

Так по пайпу на процесс. Кладёшь их в массив в главном процессе, и обходишь его. С локом по таймауту.

но и очереди (которые гарантируют лок) так же не подходят, так как время, затраченное на подготовку объектом-провайдером конечных данных, может достигать до 1-й минуты, и в таком случае, все подпроцессы будут ждать своей очереди

Таймаут, таймаут.

А в конце работы подпроцессов слать какой-нибудь специальный код, которые будет вызывать закрытие пайпа. Эдакая event-driven фигня получается.

anonymous
()
Ответ на: комментарий от xtesterx

оканчивает работу один, сразу запускается второй

Что мешает сделать воркер постоянно работающим?

P.S. Мне кажется, ты нихрена не понял сути multiprocessing.

baverman ★★★
()
Ответ на: комментарий от anonymous

Кладёшь их в массив в главном процессе и обходишь его.

Можно сделать очередь готовности.

baverman ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.