在Windows上使用python进行多处理时,预计会保护程序的入口点。 该文件说:“确保主模块可以安全地导入一个新的Python解释器而不会造成意想不到的副作用(如启动一个新的过程)”。 任何人都可以解释这到底是什么意思?
如果您了解了Linux-y系统的功能,那么扩展一下您已有的良好答案。 他们使用fork()产生新的进程,这有两个好的结果:
fork()之后的指令处开始执行 – 因此,已经在模块中执行的任何模块级代码将不会再次执行。 fork()在Windows中是不可能的,所以在Windows上,每个子进程重新导入每个模块。 所以:
所以你只需要在主程序中考虑一下你想要执行的代码。 最明显的例子是你想要创建子进程的代码只能在主程序中运行,所以应该用__name__ == '__main__'来保护。 对于一个微妙的例子,考虑构建一个巨大的列表的代码,你打算传递给工作进程爬过。 你可能也想保护它,因为在这种情况下没有意义使每个工作进程浪费内存,并且花时间去构建自己无用的副本。
请注意,即使在Linux-y系统上也适当地使用__name__ == "__main__"是一个好主意,因为它使得工作分工更清晰 。 并行程序可能会引起混淆 – 每一点帮助;-)
multiprocessing模块通过创建将导入模块的新Python进程来工作。 如果你没有添加__name__== '__main__'保护,那么你将进入新的进程创建永无止境的循环。 它是这样的:
multiprocessing产生4个新的进程。 multiprocessing产生16个新进程。 multiprocessing产生64个新进程。 所以这个想法是,你确保进程产卵只发生一次。 用__name__== '__main__'保护的习惯用法最容易实现。