首页 > 解决方案 > 如果 __name__==__main__ 运行,为什么我的 python 脚本会继续运行?

问题描述

以下是我面临的问题的简化版本。当我运行代码时,例如下面的示例,为什么脚本在 if _name__==__main_ 部分下方运行代码,而位于 if 语句下方的函数仍在运行?我认为 p_1.join() 命令应该阻止脚本继续,直到单独的进程完成。在下面的输出中,我希望仅在所有脚本结束时才打印“完成”一词 - 但它是第二次打印,然后是最后一次打印。

过去我曾使用 poolexecutor 来解决类似的问题;但在这个项目中,我需要单独启动每个进程,以便为每个进程分配单独的独立功能。

import time
from multiprocessing import Process, Queue

def a(x,q):
    time.sleep(3)
    q.put(x*x)

q=Queue()
def main():
    print("Main Function Starts")
    p_1 = Process(target=a, args=(5,q))
    p_1.start()
    p_1.join()
    b= q.get()
    print(b)
    print("Main Function Ends")

if __name__ == '__main__':        
       main()

print("Finished")

**Output:**
Main Function Starts
Finished
25
Main Function Ends
Finished

标签: pythonif-statementmultiprocessing

解决方案


你应该把那个代码放在警卫里if __name__ == '__main__'。防止这种事情是重点if __name__ == '__main__'

你在 Windows 上。当您启动时p_1,会multiprocessing启动一个单独的 Python 进程,该进程所做的第一件事就是您的文件作为模块导入。当它这样做时,模块__name__is not '__main__',所以if __name__ == '__main__'守卫内的任何东西都不会运行,而是print("Finished")在守卫之外。

您的程序main()main()仍在运行时不会以某种方式继续过去。工作进程正在执行不需要的打印。


推荐阅读