#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
работ полностью по назначению для этой цели.