为什么Windows上的ProcessPoolExecutor在从另一个模块提交函数时需要__main__保护?

时间:2016-08-06 06:23:39

标签: python python-multiprocessing python-module

假设我有一个程序

import othermodule, concurrent.futures
pool = concurrent.futures.ProcessPoolExecutor()

然后我想说

fut = pool.submit(othermodule.foo, 5)
print(fut.result())

官方文档说我需要用if __name__ == '__main__'来保护后两个语句。这并不难,我只想知道为什么foo住在othermodule,它知道(foo.__module__ == 'othermodule')。 5是文字int。两者都可以进行pickle和unpickled,而无需参考创建池的模块。我认为没有理由为什么ProcessPoolExecutor必须在另一方面导入它。

我的模型是这样的:你启动另一个python进程,pickle othermodule.foo5,并通过一些IPC方法(Queue,Pipe,无论如何)发送它们。另一个过程取消了它们(当然导入othermodule,找到foo的代码),然后调用foo(5),将结果发回(再次通过pickle和一些IPC)。显然我的模型是错误的,但我想知道它的错误。

也许是唯一的原因,在Unix上,这是通过分叉__main__来解决的,所以在Windows上(fork不能真正起作用),他们做了最接近的程序模仿,而不是最接近的模仿意图?在这种情况下,它可以在Windows上修复吗?

(是的,我知道Why does Python's multiprocessing module import __main__ when starting a new process on Windows?。在我看来,它回答了一个稍微不同的问题。但你可以尝试用它的答案向我解释为什么这个问题的答案必须相同。)< / p>

0 个答案:

没有答案