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默认为Nonename进程名,不写会默认args为目标方法传递位置可变(元组)参数kwargs为目标方法传递关键字可变(字典)参数daemon布尔值,是否为守护进程
"如果文章对您有帮助,可以请作者喝杯咖啡吗?"
微信支付
支付宝