Как передать переменные между процессами с помощью многопроцессорной очереди ()? - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь запустить два отдельных процесса Python параллельно с необходимостью, чтобы процессы передавали данные туда и обратно. MCV, который я включил, отражает структуру базовых пакетов, которые я использую - я надеялся, что решение, использующее многопроцессорность, избавит от необходимости радикально изменить базовый код любого из них.

Чтобы подвести итог взаимодействия, 1) дочерний процесс запускается и добавляет начальное значение в очередь 2) родительский процесс должен затем взять значение, сделать что-то и вернуть новое значение в другую очередь, которая 3) дочерний процесс читает и печатает. (На самом деле оба эти процесса представляют собой автономные циклы, которые будут выполняться тысячи итераций, передавая данные туда и обратно ... надеюсь)

Однако все зависает в ожидании запуска родительского процесса (т.е. после шага 1). Дочерний процесс блокирует запуск родительского процесса?

Я просмотрел множество подобных, но не совсем одинаковых сценариев, а также многопроцессорные документы и ряд учебных пособий, и не могу точно понять, что является причиной проблемы.

import multiprocessing
from multiprocessing import Process
from time import sleep

def sub_func(x,q1,q2):

    queue1 = q1
    queue2 = q2

    y = x*x
    queue1.put(y)
    #print(queue1.qsize())#prints 1 as expected

    while queue2.empty():
        sleep(0.01) # Hangs here

    z = queue2.get()
    print(z)

def start_sub(q1,q2):

    sub_func(5,q1,q2)

class parent():

    def main_func():

        while q1.empty():
            sleep(0.01)

        y = q1.get()
        z = y*y
        q2.put(z)


if __name__=='__main__': # Is this necessary?

    q1 = multiprocessing.Queue()
    q2 = multiprocessing.Queue()

    subprocess = Process(target=start_sub(q1,q2))
    subprocess.start()
    print('subprocess started') # Doesn't get executed
    parent.main_func() # Does main need q1,q2 passed?

Я аннотировал код для включения (что я думаю) происходит, т. Е. Дочерний процесс успешно запущен, но зависает, ожидая, пока родительский процесс добавит элементы в очередь (q2). Кажется, родительский процесс даже не начинается.

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

Буду очень признателен за любые советы о том, как это исправить, или если я нахожусь на неправильном пути, может быть, толчок в правильном направлении?

...