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进程,它的执行逻辑和你猜测的两种情况都不一样,具体步骤如下:
子进程的模块加载逻辑
子进程启动后,会重新加载整个test.py文件,但此时子进程的__name__变量不是__main__(通常是__mp_main__,不同平台可能有小差异),所以if __name__ == '__main__':代码块里的内容完全不会执行——这也是为什么必须加这个判断,不然子进程会重复创建新进程,陷入死循环。目标函数与参数的传递
主进程会通过进程间通信(IPC)机制,把你指定的target(也就是compute_square函数)的引用、以及args里的参数传递给子进程。子进程加载完模块后,就能找到这个函数,然后传入参数执行它。子进程的生命周期
子进程执行完目标函数后,会直接退出整个Python解释器进程,不会继续执行模块里的其他代码(加载模块时只会执行顶层的函数定义,没有其他执行逻辑)。
简单总结:子进程不是重新跑一遍脚本的主逻辑,而是加载脚本模块拿到目标函数,执行指定任务后就直接退出。
内容的提问来源于stack exchange,提问作者youkaichao
相关产品推荐
相关产品推荐

