在Windows上使用python进行多处理时,预计会保护程序的入口点。 该文件说:“确保主模块可以安全地导入一个新的Python解释器而不会造成意想不到的副作用(如启动一个新的过程)”。 任何人都可以解释这到底是什么意思?
我怎样才能从孩子的过程中获得价值?
多叉()并发
使用IPython Notebook在Windows上的类中使用multiprocessing.Pool
Python多处理apply_async从不在Windows 7上返回结果
为什么孩子没有死?
如果您了解了Linux-y系统的功能,那么扩展一下您已有的良好答案。 他们使用fork()产生新的进程,这有两个好的结果:
主程序中存在的所有数据结构对于子进程都是可见的。 他们实际上工作在数据的副本上。
子进程在紧跟在主程序中的fork()之后的指令处开始执行 – 因此,已经在模块中执行的任何模块级代码将不会再次执行。
fork()在Windows中是不可能的,所以在Windows上,每个子进程重新导入每个模块。 所以:
在Windows上,主程序中不存在对子进程可见的数据结构; 和,
所有模块级代码都在每个子进程中执行。
所以你只需要在主程序中考虑一下你想要执行的代码。 最明显的例子是你想要创建子进程的代码只能在主程序中运行,所以应该用__name__ == '__main__'来保护。 对于一个微妙的例子,考虑构建一个巨大的列表的代码,你打算传递给工作进程爬过。 你可能也想保护它,因为在这种情况下没有意义使每个工作进程浪费内存,并且花时间去构建自己无用的副本。
请注意,即使在Linux-y系统上也适当地使用__name__ == "__main__"是一个好主意,因为它使得工作分工更清晰 。 并行程序可能会引起混淆 – 每一点帮助;-)
multiprocessing模块通过创建将导入模块的新Python进程来工作。 如果你没有添加__name__== '__main__'保护,那么你将进入新的进程创建永无止境的循环。 它是这样的:
你的模块被导入并在导入过程中执行代码,导致multiprocessing产生4个新的进程。
这4个新进程依次导入模块并在导入过程中执行代码,导致multiprocessing产生16个新进程。
这16个新进程依次导入模块并在导入过程中执行代码,导致multiprocessing产生64个新进程。
那么,希望你能得到这张照片。
所以这个想法是,你确保进程产卵只发生一次。 用__name__== '__main__'保护的习惯用法最容易实现。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。