1. 进程
- 程序:例如xxx.py这是程序,是一个静态的
- 进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元。不仅可以通过线程完成多任务,进程也是可以的
2. 进程的状态
工作中,任务数往往大于cpu的核数,即一定有一些任务正在执行,而另外一些任务在等待cpu进行执行,因此导致了有了不同的状态
- 就绪态:运行的条件都已经慢去,正在等在cpu执行
- 执行态:cpu正在执行其功能
- 等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态
3.进程的创建步骤
导入进程模块
import multiprocessing
创建一个进程的实力对象
p = Multiprocessing.Process(target=func_name[,args=(元组), kwargs={字典}])
创建并启动进程
p.start()
p.join(5)
4.通过Queue实现进程间通信
创建一个队列
q = multiprocessing.Queue(3)
# 3代表队列中最多可以接收三条消息
向队列中添加数据
q.put(data)
从队列中取数据
q.get()
判断队列中是否为空
q.empty()
判断队列中是否已满
q.full()
如果是通过进程池创建的进程,那么队列的使用要用
multiprocessing.Manager().Queue()的方式,否则会报错。
5.进程池Pool
当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。
初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务
进程池的实现步骤
导入进程池模块
from multiprocessing import Pool
定义进程池,最大进程池最大数
po = Pool(3)
通过进程池调用目标 apply_async非阻塞,不会等待子进程结束;apply阻塞,会等待子进程结束才结束
po.apply_async(要调用的目标,(传递给目标的参数元祖,))
关闭进程池
po.close()
等待进程池执行完毕
po.join()