下面是我面临的问题的简化版本。当我运行我的代码时,下面的示例,为什么脚本在 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__'
的重点。
你在窗户上。当你开始p_1
时,multiprocessing
启动一个单独的Python进程,该进程做的第一件事就是将你的文件作为模块导入。当它这样做时,模块的__name__
不会'__main__'
,所以if __name__ == '__main__'
守卫内部的任何东西都不会运行,但print("Finished")
在防护装置之外。
您的程序不会以某种方式持续过去main()
而main()
仍在运行。工作进程正在执行不需要的打印。
你如何运行你的脚本?当我在命令行上运行您的脚本时,"完成"打印了一次,如下所示。
$ python test.py
Main Function Starts
25
Main Function Ends
Finished