python - 如果 __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
解决方案
你应该把那个代码放在警卫里if __name__ == '__main__'
。防止这种事情是重点if __name__ == '__main__'
。
你在 Windows 上。当您启动时p_1
,会multiprocessing
启动一个单独的 Python 进程,该进程所做的第一件事就是将您的文件作为模块导入。当它这样做时,模块__name__
is not '__main__'
,所以if __name__ == '__main__'
守卫内的任何东西都不会运行,而是print("Finished")
在守卫之外。
您的程序main()
在main()
仍在运行时不会以某种方式继续过去。工作进程正在执行不需要的打印。
推荐阅读
- json - 我无法使用 PHP 从 JSON 结果中提取数据
- sql - 如何在 knex.js 中的 .select() 内有条件地附加列
- java - 如何在 Spring 的 @Bean 中使用注释为 @Builder 的类?
- ios - 协议扩展在 Swift 中是如何工作的?
- c++ - gdb 在调试期间跳回上一行
- angular - 是否可以将服务注入子组件?
- c++ - constexpr 数组初始化
- angular - 如何在 Angular 8 中使用 *ngFor 手风琴
- data-warehouse - 产品和评论系统的维度建模
- reactjs - 如何从 Web 应用程序/服务器发送数据以响应本机应用程序?