可以在Python中多次使用multiprocessing.Pipe()

时间:2017-10-25 05:13:29

标签: pipe

我是编码的新手。想知道是否可以多次使用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()

1 个答案:

答案 0 :(得分:2)

如果你现在还没弄明白,问题是你要关闭两个连接对象(你称之为“r”和“w”)。一旦你关闭它们就不能再使用它们了。只需注释掉 close 语句即可。如果要手动关闭它们,请在所有 join 语句后执行此操作。

我也会改变f2:

while r.poll(1):
    try:
    ...

如果它不接收超过一秒的数据,它将退出循环。