如何使用multiprocessing Queue()在进程之间传递变量?

时间:2019-04-19 16:32:01

标签: python python-3.x parallel-processing multiprocessing subprocess

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

如果对解决此问题有任何建议,或者如果我完全走错了路,也许是朝着正确的方向轻推了,

0 个答案:

没有答案