假设我有一个程序
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.foo
和5
,并通过一些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>