Дублирование многопроцессорной обработки.Очередь » между порожденными процессами

#python #linux #multiprocessing #queue

Вопрос:

Это похоже на редко обсуждаемую тему в Google и StackOverflow, поскольку большинство вопросов неверно истолковывают, как использовать multiprocessing.Queue (что я вполне могу делать), или просто объясняют проблему невозможности выбора очереди.

На Linux 5.10.15-zen2-1-zen :

 import multiprocessing   class Example:  def __init__(self):  self.rx_queue = multiprocessing.Queue()   def poll(self):  print("received queue?", self.rx_queue.get())   if __name__ == "__main__":  queue_to_duplicate = multiprocessing.Queue()   ex = Example()  ex_proc = multiprocessing.Process(target=ex.poll)  ex_proc.start()   ex.rx_queue.put(queue_to_duplicate)  ex_proc.join()  # RuntimeError: Queue objects should only be shared between processes through inheritance  

У меня есть следующий пример кода, я намерен передать multiprocessing.Queue объект или дублировать файловый дескриптор, чтобы я мог воссоздать его в процессе получения. Суть того, почему я пытаюсь это сделать, заключается в том, что один основной процесс может инициировать канал связи с учетом очереди других процессов, а затем этот другой процесс может создать свою собственную очередь для завершения дуплекса.

Я вполне могу упустить очевидную альтернативу, но я понимаю, что Linux поддерживает dup* системные вызовы и что a multiprocessing.Queue состоит из Connection объектов, которые тонко лежат поверх файловых дескрипторов, которые я теоретически мог бы дублировать, но как, я не уверен.

Ответ №1:

 import multiprocessing   class Example:  def __init__(self):  self.rx_queue = multiprocessing.Queue()   def poll(self):  queue = self.rx_queue.get()  queue.put("echo")   if __name__ == "__main__":  manager = multiprocessing.Manager()  queue_to_duplicate = manager.Queue()   ex = Example()  ex_proc = multiprocessing.Process(target=ex.poll)  ex_proc.start()   ex.rx_queue.put(queue_to_duplicate)  ex_proc.join()   print(queue_to_duplicate.get())  # ... "echo"  

Надзор с моей стороны за документацией, использование multiprocessing.Manager работ полностью по назначению для этой цели.