我观察到该代码无法在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。
谢谢。