python - 为什么在引入 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)
解决方案
问题是您print(conn2.recv())
在开始第二个过程之前从管道收到。这会导致第二个过程延迟到第一个过程完成。
当第二个进程在主进程中运行时也会发生这种情况,就像您的示例中那样,与注释掉的行一样令人困惑。改变:
print(conn2.recv())
funcb(mylist,conn1)
至:
funcb(mylist,conn1)
print(conn2.recv())
推荐阅读
- angular - Angular HTTP 请求中缺少协商令牌
- multithreading - 如果并发线程数为 10 且 SysTick 时间为 10mSec,则 1 个线程执行时间(量子)是多少?
- java - 如何在 RHEL RedHatLinux 机器上验证哪个 openjdk 发行版供应商?
- jquery - 在rails条件中使用js变量
- java - 鼠标滚轮上的水平滚动不适用于 RecyclerView Android
- vb.net - Option Strict On 不允许在 vb.net 中进行后期绑定
- javascript - 如何在后端 express 函数中访问当前 url 中的参数?(见说明)
- android-studio - 当我运行我的项目时,为什么会出现这个错误?
- typescript - 在 Angular 6 中集成 Stripe 支付网关时面临“需要卡”错误
- hdfs - HA namenode config的hdfs上的Flink检查点