首页 > 解决方案 > 为什么在引入 pipe() 时 Python 不并行计算?

问题描述

当我使用多处理运行两个函数时,我可以得到它们并行运行的结果。但是现在我想让两个子进程相互通信,所以我引入了 Pipe() 方法,之后我发现这两个函数并没有并行运行

(我附加的项目花费了 2s 而不是 1s...如果我删除所有 pipe() 方法,它将只花费 1s,这意味着两个函数并行运行)。

我想知道我的代码有什么问题..当我使用 join() 或 recv() 时有什么问题吗?

总之,我想知道当我使用 Pipe() 在它们之间进行一些通信时如何使两个函数并行工作?多谢 !

import numpy as np
import multiprocessing
import time 

def funca(mylist,conn):
        time.sleep(1)         
        mylist.append(666.6)
        conn.send(['a','a','a'])

def funcb(mylist,conn):
        time.sleep(1)
        mylist.append(66.6)
        conn.send(['b','b','b'])

if __name__ == "__main__":
    samples = [1,2,3]
    with multiprocessing.Manager() as MG: 
        conn1,conn2 = multiprocessing.Pipe()
        mylist = MG.list(samples)  
        tic = time.time()
        p1=multiprocessing.Process(target=funca,args=(mylist,conn1) ) 
        p1.start()
        print(conn2.recv())
        funcb(mylist,conn1)
#        p2=multiprocessing.Process(target=funcb,args=(mylist,conn1) ) 
#        p2.start()
        print(conn2.recv())
        p1.join()
#        p2.join()
        p1.terminate()
#        p2.terminate()
        print(list(mylist))
    toc = time.time()
    print('pass time = ',toc-tic)

标签: pythonmultiprocessingpipepython-multiprocessing

解决方案


问题是您print(conn2.recv())在开始第二个过程之前从管道收到。这会导致第二个过程延迟到第一个过程完成。

当第二个进程在主进程中运行时也会发生这种情况,就像您的示例中那样,与注释掉的行一样令人困惑。改变:

print(conn2.recv())
funcb(mylist,conn1)

至:

funcb(mylist,conn1)
print(conn2.recv())

推荐阅读