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
相关产品推荐
相关产品推荐

