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

Python多进程疑问:每个进程是否生成两个线程及相关问题

关于multiprocessing.Process的两个问题解答

问题背景

使用multiprocessing.Process启动子进程时,出现子进程先执行脚本全局代码(如末尾的End mainline code打印)再运行目标函数的情况;添加exit(0)后目标函数不执行,添加time.sleep(5)则目标函数延迟执行。同时设置Process的name参数后,系统进程名仍显示为python.exe。


1. Process()函数是否既会启动整个程序作为子进程,又单独运行指定的目标函数?

是的,这是Windows系统下multiprocessing默认spawn启动方式的特性:

  • 不同于Linux的fork(直接复制父进程地址空间),Windows的spawn会启动全新的Python解释器进程,重新加载整个脚本文件。
  • 子进程加载脚本时,会执行所有不在if __name__ == '__main__':代码块中的全局代码(比如你脚本末尾的print('End mainline code...')),之后才会切换到指定的目标函数执行。
  • 当你在脚本最后加exit(0)时,子进程加载脚本后直接执行exit(0)退出,根本没机会进入目标函数;加time.sleep(5)时,子进程先执行sleep延迟,之后才会运行目标函数,所以输出会延后。

2. 为何已给每个Process指定name参数,进程名称仍显示为python.exe?

你设置的Process(name=...)是Python进程对象的内部标识名称,和操作系统层面的进程名称不是一回事:

  • 操作系统显示的进程名是运行的可执行文件名称,也就是python.exe(Windows)或python3(类Unix系统),这无法通过multiprocessing.Process的参数直接修改。
  • 如果要查看你自定义的进程内部名称,需要用multiprocessing.current_process().name,而不是psutil.Process().name()(后者获取的是系统级进程名)。

修改目标函数验证这一点:

def f(name):
    from multiprocessing import current_process
    print('\nStarting process ID:', os.getpid())
    print ('I am process with argument: ', name)
    print ('parent: ', os.getppid())
    print ('内部进程名: ', current_process().name)  # 会输出你设置的process-1/process-2
    print ('系统进程名: ', psutil.Process().name())   # 仍然是python.exe

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 07:17:45