可以在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的主要内容,如果未能解决你的问题,请参考以下文章

Python多进程相关的坑

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

Python多任务教程

准确确定在 Python 多处理期间腌制的内容

python 进程池的使用

使用 Python 多处理进行通信的 OSX 和 Linux 之间的性能差异