可以在Python中多次使用multiprocessing.Pipe()进行IPC
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可以在Python中多次使用multiprocessing.Pipe()进行IPC相关的知识,希望对你有一定的参考价值。
我是编码的新手。想知道是否可以多次使用Pipe()进行进程间通信。如果是,我在下面的代码中缺少什么?如果不是,那么一个管道不能多次使用的原因是什么。
import multiprocessing
def f1(pipe):
r, w = pipe
r.close()
for n in range(10):
w.send(n)
def f2(pipe):
r, w = pipe
w.close()
while True:
try:
item = r.recv()
except EOFError:
break
print("Item received by f2:", item)
def f3(pipe):
r, w = pipe
r.close()
for n in range(10, 21):
w.send(n)
def f4(pipe):
r, w = pipe
w.close()
while True:
try:
item = r.recv()
except EOFError:
break
print("Item received by f2:", item)
if __name__ == '__main__':
(r, w) = multiprocessing.Pipe()
p1 = multiprocessing.Process(target=f1, args=((r, w),))
p2 = multiprocessing.Process(target=f2, args=((r, w),))
p1.start()
p2.start()
w.close()
p1.join()
p2.join()
#(r, w) = multiprocessing.Pipe()
p3 = multiprocessing.Process(target=f3, args=((r, w),))
p4 = multiprocessing.Process(target=f4, args=((r, w),))
p3.start()
p4.start()
w.close()
p3.join()
p4.join()
答案
如果你现在还没弄明白,问题是你要关闭两个连接对象(你称之为“r”和“w”)。一旦你关闭它们就不能再使用它们了。只需注释掉密切的陈述,就应该有效。如果要手动关闭它们,请在所有连接语句之后执行此操作。
我也会改变f2:
while r.poll(1):
try:
...
这样,如果它不接收超过一秒的数据,它将退出循环。
以上是关于可以在Python中多次使用multiprocessing.Pipe()进行IPC的主要内容,如果未能解决你的问题,请参考以下文章