Я пытаюсь запустить два отдельных процесса 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 (), чтобы дождаться завершения дочернего процесса.
Буду очень признателен за любые советы о том, как это исправить, или если я нахожусь на неправильном пути, может быть, толчок в правильном направлении?