Python - 对多个进程使用相同的双工Pipe()

时间:2017-01-23 17:49:21

标签: python multiprocessing

我有两个流程:proc_a,proc_b,我希望 proc_a 返回等于data_new的值。 这是可能的还是我必须使用多个管道?

if __name__ == '__main__':

    parent, child = Pipe()
    p1 = Process(target=proc_a, args=(parent, child,))
    p2 = Process(target=proc_b, args=(parent, child,))

    p1.start()
    p2.start()
    p1.join()
    p2.join()

proc_a()proc_b()上:

def proc_a(parent, child):
        data = somedata
        child.send(data)
        result = parent.recv()

        return result


def proc_b(parent, child):
    data = parent.recv()
    data_new = data + 1 # Sample change 
    child.send(data_new)

1 个答案:

答案 0 :(得分:0)

您只需一根管道就可以解决它,因为管道是双向的(双工)。 但你不能做的是将管道的两端发送到两个进程。

请参阅此section of the docs

  

请注意,如果两个进程(或线程)同时尝试读取或写入管道的同一端,则管道中的数据可能会损坏。当然,同时使用管道不同端的进程不存在腐败风险。

此代码可以工作并打印2

from multiprocessing import Pipe, Process

def proc_a(pipe):
    data = 1
    pipe.send(data)
    result = pipe.recv()
    print(result)

def proc_b(pipe):
    data = pipe.recv()
    data_new = data + 1 # Sample change 
    pipe.send(data_new)

if __name__ == '__main__':
    parent, child = Pipe()
    p1 = Process(target=proc_a, args=(parent,))
    p2 = Process(target=proc_b, args=(child,))

    p1.start()
    p2.start()
    p1.join()
    p2.join()

请注意,return的{​​{1}}不执行任何操作,如果您需要在父进程中使用返回值,请查看this question