Python多进程代码为何整体执行3次?与YouTube示例差异解析
Python多进程重复输出与
if __name__ == '__main__'问题解析 1. 多次输出Finished in...的原因及修复
你的代码里,计算耗时和打印结果的语句写在了if __name__ == '__main__':代码块外面。在Windows系统中,Python多进程采用spawn模式创建子进程——子进程会重新导入整个脚本文件,这就导致每个子进程都会执行脚本中不在if __name__判断内的代码,包括那两行打印耗时的语句。主进程执行一次,两个子进程各执行一次,最终就出现了三次Finished in...的输出。
把耗时计算和打印逻辑移到if __name__ == '__main__':内部就能解决问题,修改后的代码如下:
import multiprocessing import time def do_something(): print('Sleeping 1 second...') time.sleep(1) print('Done sleeping...') if __name__ == '__main__': start = time.perf_counter() p1 = multiprocessing.Process(target=do_something) p2 = multiprocessing.Process(target=do_something) p1.start() p2.start() p1.join() p2.join() finish = time.perf_counter() print(f'Finished in {round(finish-start, 2)} seconds(s)')
修改后只有主进程会执行耗时统计和打印操作,子进程导入脚本时因为__name__不等于'__main__',不会触发这部分逻辑,输出就能和示例一致了。
2. 为什么YouTube示例不用if __name__ == '__main__'也能正常运行
根源在于不同操作系统的多进程实现机制差异:
- Unix/Linux/macOS:多进程采用
fork模式,直接复制父进程的内存空间,不会重新导入脚本文件,所以即使没有if __name__判断,子进程也不会重复执行主程序代码。 - Windows:只能使用
spawn模式创建子进程,必须重新导入脚本,因此必须用if __name__ == '__main__':包裹主逻辑,避免子进程重复执行初始化代码。
YouTube示例的运行环境大概率是Unix类系统,所以不需要这个判断也能正常工作;而你在Windows环境下运行,就必须加上这个判断才能避免重复执行问题。
内容的提问来源于stack exchange,提问作者typeG10
相关产品推荐
相关产品推荐

