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

Python多进程中进程生命周期及子进程执行机制咨询

Python多进程中子进程的执行机制解析

问题背景

我理解常规Python脚本的生命周期,比如执行python script.py时:

  • Shell接收命令,操作系统创建新进程执行python
  • Python可执行文件初始化解释器,开始执行script.py
  • 脚本执行完毕,Python解释器退出

但在多进程场景下,我对其他进程的执行逻辑有疑问,以这段代码为例:

# test.py
import multiprocessing

# 计算数字平方的函数
def compute_square(number):
    print(f'数字{number}的平方是{number * number}')

if __name__ == '__main__':
    # 待计算的数字列表
    numbers = [1, 2, 3, 4, 5]
    
    # 存储所有进程的列表
    processes = []
    
    # 为每个数字创建一个进程计算平方
    for number in numbers:
        process = multiprocessing.Process(target=compute_square, args=(number,))
        processes.append(process)
        process.start()
    
    # 等待所有进程执行完毕
    for process in processes:
        process.join()

    print("所有进程已执行完毕。")

执行python test.py时,主进程会把test.py作为__main__模块执行,但子进程的执行流程是怎样的?具体疑问:

  • 调用multiprocessing.Process.start()后,子进程会发生什么?
  • 它是如何调用Python解释器的?如果只是执行python script.py,怎么知道要运行compute_square函数?是不是用python -i加管道传递命令?

子进程执行流程详解

当你调用process.start()时,操作系统会创建一个全新的Python进程,它的执行逻辑和你猜测的两种情况都不一样,具体步骤如下:

  1. 子进程的模块加载逻辑
    子进程启动后,会重新加载整个test.py文件,但此时子进程的__name__变量不是__main__(通常是__mp_main__,不同平台可能有小差异),所以if __name__ == '__main__':代码块里的内容完全不会执行——这也是为什么必须加这个判断,不然子进程会重复创建新进程,陷入死循环。

  2. 目标函数与参数的传递
    主进程会通过进程间通信(IPC)机制,把你指定的target(也就是compute_square函数)的引用、以及args里的参数传递给子进程。子进程加载完模块后,就能找到这个函数,然后传入参数执行它。

  3. 子进程的生命周期
    子进程执行完目标函数后,会直接退出整个Python解释器进程,不会继续执行模块里的其他代码(加载模块时只会执行顶层的函数定义,没有其他执行逻辑)。

简单总结:子进程不是重新跑一遍脚本的主逻辑,而是加载脚本模块拿到目标函数,执行指定任务后就直接退出。


内容的提问来源于stack exchange,提问作者youkaichao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:42:45