Python多进程

本文最后更新于 2026年5月30日

未完待续

1.进程

进程是操作系统进行资源分配的基本单位,每个进程拥有一块独立的内存空间,可以通过python os模块的方法来获取当前运行python程序的所属进程号和父进程号,在任务管理器中,通过进程号能查找到对应进程

import os

print(os.getpid())
print(os.getppid())
27516
13228

在Pycharm IDE中启动python解释器时,父进程往往就是Pycharm IDE


2.创建进程

python使用multiprocessing.Process类来管理进程,创建进程时就要通过target制定好进程将要执行的任务,创建后,调用start()方法,向操作系统申请进程,将该进程交给操作系统进行调度,子进程才会真的启动。可以使用multiprocessing.current_process()方法获取当前进程

创建进程的Process(target=study)必须出现在 if __name__ == '__main__':内,因为当新进程创建时,python底层会启动一个新的解释器,再次运行study函数所在py文件,只获得study函数的定义交给子进程,如果没有 if __name__ == '__main__':判断,Process(target=study)也会被新的解释器进程执行到,最终出现死循环创建进程

当子进程的解释器运行py文件时,__name__也是有值的,它的值是:__mp_main__

执行时,主/子进程执行是异步的,子进程执行不影响主进程

子进程之间也不一定是先start()的先执行,一切以操作系统调度为准

import os
import time
from multiprocessing import Process, current_process

print('hello world ', __name__)

def study():
    for i in range(100):
        print('%s %s 父进程 %s 进程 %s Study' % (current_process(), i, os.getppid(), os.getpid()) , end='\n')
        time.sleep(1)

def speak():
    for i in range(100):
        print('%s %s 父进程  %s 进程 %s speak' % (current_process(), i, os.getppid(), os.getpid()) , end='\n')
        time.sleep(1)



if __name__ == '__main__':
    print('主进程开始执行')
    task1 = Process(target=study)
    task2 = Process(target=speak)
    print('主进程 ', os.getpid())

    p1 = Process(target=study)
    p2 = Process(target=speak)

    p1.start()
    p2.start()
    print('主进程结束执行')

hello world  __main__
主进程开始执行
主进程  12080
主进程结束执行
hello world  __mp_main__
<Process name='Process-3' parent=12080 started> 0 父进程 12080 进程 45936 Study
hello world  __mp_main__
<Process name='Process-4' parent=12080 started> 0 父进程  12080 进程 44440 speak
<Process name='Process-3' parent=12080 started> 1 父进程 12080 进程 45936 Study
<Process name='Process-4' parent=12080 started> 1 父进程  12080 进程 44440 speak
<Process name='Process-3' parent=12080 started> 2 父进程 12080 进程 45936 Study
<Process name='Process-4' parent=12080 started> 2 父进程  12080 进程 44440 speak
<Process name='Process-3' parent=12080 started> 3 父进程 12080 进程 45936 Study
<Process name='Process-4' parent=12080 started> 3 父进程  12080 进程 44440 speak
<Process name='Process-3' parent=12080 started> 4 父进程 12080 进程 45936 Study
<Process name='Process-4' parent=12080 started> 4 父进程  12080 进程 44440 speak
<Process name='Process-3' parent=12080 started> 5 父进程 12080 进程 45936 Study
<Process name='Process-4' parent=12080 started> 5 父进程  12080 进程 44440 speak
.............

Process类有以下参数,有的是继承来的:

  • group 默认为None
  • name 进程名,不写会默认
  • args 为目标方法传递位置可变(元组)参数
  • kwargs 为目标方法传递关键字可变(字典)参数
  • daemon 布尔值,是否为守护进程

"如果文章对您有帮助,可以请作者喝杯咖啡吗?"

微信二维码

微信支付

支付宝二维码

支付宝


Python多进程
https://blog.liuzijian.com/post/2026/03/20/python-process/
作者
Liu Zijian
发布于
2026年3月20日
更新于
2026年5月30日
许可协议