You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:55:23