在Python里面,由于有全局解释器锁的存在,在同一时刻只能有一个线程在执行,因此如果是计算密集型的任务,要想实现并行,需要采用多进程编程。
1、基本概念
1.1 进程的概念
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
1.2 进程的状态
进程执行时的间断性,决定了进程可能具有多种状态。事实上,运行中的进程可能具有以下三种基本状态。
1)就绪状态(Ready):
进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。
2)运行状态(Running):
进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。
3)阻塞状态(Blocked):
由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生前即使把处理器资源分配给该进程,也无法运行。
1.3 什么情况下使用多进程
当一个计算任务可以对输入数据分别进行处理的时候,可以使用多进程编程提高任务执行的效率。开启的进程数可以是小于等于cpu核心数的一个值。
2、Python实现多进程
2.1 简单示例
在Python里面,可以通过 multiprocessing 模块在程序中创建、管理进程。
第一种方式可以使用 Process 类,下面代码创建了3个进程对输入数据进行处理。首先定义一个对数据进行处理的函数,在下面代码中这个函数是 t1 ,然后把要处理的数据序列中的数值分别作为3个进程调用函数 t1 的参数:
import os
import time
import random
from multiprocessing import Process
from multiprocessing import Pool
def t1(tmp):
print(tmp, 'starting;', '线程ID是', os.getpid()) # 打印当前开启的进程的 ID
time.sleep(random.randrange(1,5)) # 让进程持续随机的几秒
print(tmp, 'end') # 进程结束
if __name__ == '__main__':
for i in range(3):
p = Process(target=t1, args=(i,))
p.start() # 启动进程
print('主线程', '线程ID是', os.getpid()) # 打印主进程的ID
输出的结果如下:
# 在这里开启子进程之后没有用join方法启动守护进程,所以主进程先执行完
主线程 线程ID是 19665
0 starting; 线程ID是 19667
1 starting; 线程ID是 19668
2 starting; 线程ID是 19669
1 end
0 end
2 end
第二种创建和使用进程的方式是用 Pool 类,创建一个进程池管理多个进程。进程池