Python多处理管道和cloudpickle

时间:2018-07-19 18:42:28

标签: python python-multiprocessing

我观察到该代码无法在Windows上运行,似乎PipeConnection句柄无法以1:1复制,因此我认为在处理PipeConnection类型的Process args时,多处理lib会做一些额外的工作。这是一个问题的玩具示例:

import multiprocessing, cloudpickle

def _thunk(pipe):
    def f():
        test = pipe[1].recv()
        pipe[1].send(test)

    return f


def _worker(pickled_f):
    f = cloudpickle.loads(pickled_f)
    f()


if __name__ == '__main__':
    pipe = multiprocessing.Pipe()

    pickled_f = cloudpickle.dumps(_thunk(pipe))
    multiprocessing.Process(target=_worker, args=(pickled_f,)).start()

    pipe[0].send('test')
    test = pipe[0].recv()

    print(test)

我想解决这个问题,但是我无法修改multiprocessing.Process调用,因为它位于代码之外的lib中。只要我可以将逻辑封装在thunk中,就可以使用其他同步机制。但是理想情况下,我希望能够在新过程中重建一个工作的Pipe。

谢谢。

0 个答案:

没有答案