>当我使用多处理来运行两个函数时,我可以得到它们并行运行的结果。但是现在我希望两个子进程相互通信,所以我引入了 Pipe(( 方法,之后我发现这两个函数不是并行运行的
。(我附加的项目成本为 2 秒而不是 1 秒......如果我删除所有 pipe(( 方法,它只需要 1 秒,这意味着两个函数并行运行(。
我想知道我的代码出了什么问题.. 当我使用 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)
问题是您在开始第二个进程之前从管道print(conn2.recv())
收到。这会导致第二个进程延迟到第一个进程完成。
当第二个进程在主进程中运行时,也会发生这种情况,就像在您的示例中发生的那样,与注释掉的行混淆。改变:
print(conn2.recv())
funcb(mylist,conn1)
自:
funcb(mylist,conn1)
print(conn2.recv())