首页 > 解决方案 > 如何使用多处理Queue()在进程之间传递变量?

问题描述

我正在尝试并行运行两个单独的 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() 等待子进程结束将不起作用。

真的很感激任何关于如何解决这个问题的建议,或者如果我完全走错了路,也许是朝着正确的方向轻推?

标签: pythonpython-3.xparallel-processingmultiprocessingsubprocess

解决方案


推荐阅读