下面是我面临的问题的简化版本。当我运行我的代码时,例如下面的示例,为什么脚本在 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
最佳答案
您应该将该代码放在 if __name__ == '__main__'
守卫中。 if __name__ == '__main__'
的重点就是防止这种事情发生。
您使用的是 Windows。当您启动 p_1
时,multiprocessing
会启动一个单独的 Python 进程,该进程做的第一件事就是导入您的文件作为模块。当它这样做时,模块的 __name__
不是 '__main__'
,所以 if __name__ == '__main__'
守卫内部的任何东西都不会' t 运行,但 print("Finished")
在守卫之外。
当 main()
仍在运行时,您的程序不会以某种方式继续通过 main()
。工作进程正在执行不需要的打印。
关于python - 为什么我的 python 脚本在 if __name__==__main__ 运行时继续运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59149722/