关于python:在使用多处理时,在窗口中强制使用if __name __ ==“__ main__”

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__'保护这个成语最容易实现的。