Compulsory usage of if __name__==“__main__” in windows while using multiprocessing
在Windows上使用python中的多处理时,应该保护程序的入口点。文档中说:"确保新的python解释器可以安全地导入主模块,而不会造成意外的副作用(例如启动新的进程)"。有人能解释这到底是什么意思吗?
对已经得到的好答案进行一点扩展,如果您了解Linux-Y系统的功能,这将有所帮助。它们使用fork()产生新的过程,有两个好的结果:
主程序中存在的所有数据结构对子进程都是可见的。他们实际上是在复制数据。
子进程在主程序中的fork()之后立即开始执行指令,因此模块中已执行的任何模块级代码都不会再次执行。
fork()在Windows中是不可能的,因此在Windows中,每个模块都由每个子进程重新导入。所以:
在Windows上,主程序中的数据结构对子进程不可见;并且,
所有模块级代码都在每个子进程中执行。
所以您需要考虑一下您只希望在主程序中执行哪个代码。最明显的例子是,您希望创建子进程的代码只在主程序中运行,这样应该由__name__ == '__main__'保护。对于一个更微妙的例子,考虑一下构建一个巨大列表的代码,您打算把这个列表传递给工作进程进行爬行。您可能也希望保护它,因为在这种情况下,没有必要让每个工作进程浪费RAM和时间来构建它们自己的庞大列表的无用副本。
请注意,即使在Linux-Y系统上也要适当地使用__name__ =="__main__",这是一个好主意,因为它使预期的工作划分更加清晰。并行程序可能会令人困惑-每一点帮助;-)
multiprocessing模块通过创建新的python进程来工作,该进程将导入您的模块。如果您没有添加__name__== '__main__'保护,那么您将进入一个永不结束的新进程创建循环。就像这样:
- 您的模块被导入并在导入期间执行代码,这会导致multiprocessing生成4个新进程。
- 这4个新进程依次导入模块并在导入过程中执行代码,从而导致multiprocessing生成16个新进程。
- 这16个新进程依次导入模块并在导入过程中执行代码,从而导致multiprocessing生成64个新进程。
- 希望你能拍到照片。
所以这个想法是你要确保这个过程只发生一次。这是用__name__== '__main__'保护这个成语最容易实现的。
- @在这种情况下,你应该投票结束这个问题作为一个副本。我的回答是错误的还是无益的?
- 一次又一次地重复答案和链接到已有的答案相比是没有帮助的。如果你有什么要添加到已经存在的答案中,那么你可以自由回答已经存在的问题。
- @请帮忙。找到一个副本,投你的近距离投票。如果我同意,我也会投票。与其抱怨,不如采取积极的行动。你为什么挑我?
- 这正是我无法接受的态度。为什么要创建一个副本,然后让我查找前面的问题?为什么不先花点时间查找副本,然后再创建另一个副本呢?
- @你误会了。我没有创建副本。我刚写了一个答案。复制品就是问题所在。也许你应该向提问者发表你的意见。
- 我完全理解事件的顺序。你复制了问题,你复制了答案。也许你应该对提问者发表你的评论,看看他的名誉和你的相比,回答你自己,谁更应该采取积极的行动,比如首先注意到它是重复的……
- @PiotroBrogost请使用您的能量提交一个近距离投票。