Вам нужна модель клиент-сервер в локальной системе. Вы можете сделать это с помощью сокетов TCP / IP для связи между вашими клиентами и серверами, но быстрее использовать локальные именованные каналы, если вам не нужно общаться по сети.
Основные требования к вам, если я правильно понял, таковы:
1. Производитель должен иметь возможность порождать потребителей, если их уже нет.
2. Производитель должен иметь возможность общаться с потребителями.
3. Производитель должен быть в состоянии найти уже существующих потребителей и общаться с ними.
4. Даже если производитель завершит работу, потребители должны продолжать работать.
5. Более одного производителя должны иметь возможность общаться с потребителями.
Давайте разберемся с каждым из них по очереди:
(1) - это простая проблема создания процесса, за исключением того, что потребительские (дочерние) процессы должны продолжать работать, даже если завершает работу производитель (родительский). См. (4) ниже.
(2) Производитель может общаться с потребителями, используя именованные каналы . См. os.mkfifo () и unix man-страницу из mkfifo () для создания именованных каналов.
(3) Вам нужно создать именованные каналы из процессов-потребителей по общеизвестному пути, когда они начнут работать. Производитель может выяснить, работают ли какие-либо потребители, посмотрев эту известную трубу (и) в том же месте. Если трубы не существует, потребители не работают, и производители могут их порождать.
(4) Для этого вам нужно будет использовать os.setuid () и заставить потребительские процессы действовать как демон. Смотрите unix справочную страницу от setsid ().
(5) Этот хитрый. Несколько производителей могут общаться с потребителями, используя один и тот же именованный канал, но вы не можете передать больше, чем «PIPE_BUF», объем данных от производителя к потребителю, если вы хотите надежно определить, какой производитель отправил данные, или если вы хотите предотвратить какое-либо чередование данных от разных производителей.
Лучший способ сделать (5) состоит в том, чтобы потребители открывали «управляющий» именованный канал (/tmp/control.3456, 3456 - pid потребителя) при выполнении. Производители сначала настраивают канал связи, используя «контрольный» канал. Когда производитель подключается, он отправляет свой pid, скажем, «1234», потребителю по каналу «control», который говорит потребителю создать именованный канал для обмена данными с производителем, например, «/tmp/data.1234». Затем производитель закрывает канал «control» и открывает «/tmp/data.1234» для связи с потребителем. У каждого потребителя могут быть свои собственные «контрольные» каналы (используйте пиды потребителей, чтобы различать каналы разных потребителей), и каждый производитель получает свою собственную «трубу данных». Когда производитель заканчивает , он должен очистить вверх по каналу данных или сказать потребителю сделать это. Точно так же, когда потребитель заканчивает, он должен очистить свои контрольные трубы.
Сложность заключается в том, чтобы не допустить одновременного подключения нескольких производителей к каналам управления одного потребителя. Канал «управления» здесь является общим ресурсом, и вам нужно синхронизировать между разными производителями, чтобы получить к нему доступ. Используйте для него семафоры или блокировку файла . См. posix_ipc модуль Python для этого.
Примечание: я описал большую часть вышеизложенного в терминах общей семантики UNIX, но все, что вам действительно нужно, - это способность создавать процессы-демоны, возможность создавать «именованные» каналы / очереди / все, что бы они могли быть найдены несвязанный процесс и возможность синхронизации между несвязанными процессами. Вы можете использовать любой модуль python, который обеспечивает такую семантику.