Python многопроцессорное управление памятью очереди - PullRequest
0 голосов
/ 12 сентября 2018

Скажем, у меня есть Main процессы и 2 дополнительных процесса A и B. В этой программе A должен отправлять данные в B. Если у нас есть такой код:

from multiprocessing import Process, Queue

def process_a(iterable, q):

    for x in iterable:
        q.put(x)

def process_b(q):

    while some_condition():
        x = q.get()


iterable = some_iterable()
q = Queue()

pa = Process(target=process_a, args=(iterable, q))
pb = Process(target=process_b, args=(q,))

pa.start()
pb.start()

pa.join()
pb.join()

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

A => Main => B

Если это так, есть ли способ инициализировать Queue на B и передавать его на A, чтобы данные напрямую переходили с A на B, пропуская Main?

1 Ответ

0 голосов
/ 12 сентября 2018

учитывая, что очередь q была создана в главном процессе, поток данных выглядит следующим образом?

A => Main => B

Нет.Как объясняется в документах , Queue - это просто автосинхронизирующая оболочка вокруг Pipe.Когда вы передаете Queue ребенку, вы просто передаете это Pipe и некоторые блокировки.

И Pipe - это просто оболочка вокруг канала операционной системы.Когда вы передаете Pipe дочернему элементу, вы просто передаете дескриптор / дескриптор файла канала.

Игнорируя блокировки, процесс A в основном просто пишет в канал, а процесс B просто читает изit.

Блокировки действительно усложняют ситуацию (и могут также означать, что процесс A раскручивает скрытый фоновый поток), но они все равно не задействуют основной процесс.

Если основной процесс не вызывает метод в очереди, он вообще не имеет ничего общего с этой очередью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...