目录
一、进程的基础操作
1、进程的概念
概念:一个程序运行起来后,代码+用到的资源,称为进程,是操作系统分配资源的基本单位。
2、进程的状态
- 就绪态:正在等CPU执行
- 执行态:CPU正在执行其功能
- 等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态
3、进程的创建
multiprocessing模块就是跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另外的事情。
4、进程的语法结构
-
导入模块
from multiprocessing import Process
-
Process类的相关参数
target:调用对象,子进程要执行的任务
args:以元组的形式传值
kwargs:以字典的形式传值
5、常用的方法和属性
-
常用方法
子进程.start():开启子进程
子进程.is_alive():判读子进程是否还活着
-
常用属性
子进程.name:当前进程的别名
子进程.pid:当前进程的进程号
6、进程间不共享全局变量
二、进程间的通信-Queue(队列)
可以使用multiprocessing模块的Queue实现了进程之间的数据传递,Queue本身是一个消息队列。
初始化Queue()对象时(例如:q=Queue()),若括号中没有指定最大可接收的消息数量,或数量为负值,那么就代表可接受的消息数量没有上限(直到内存的尽头);
1、队列的基本操作
- Queue.put():入队,放入数据
- Queue.get():出队,取出数据
- Queue.size():返回当前队列包含的消息数量
- Queue.empty():如果队列为空,返回True,反之False ;
- Queue.full():如果队列满了,返回True, 反之False。
进程操作队列,直接使用进程自带的Queue
三、进程池的构建
当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。
初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务。
1、概念
定于一个进程池,在里面放上固定数量的进程,有需求就拿池子中的进程来处理任务,处理完毕,进程并不关闭,而是将这个进程再放回池子中继续等待任务。
2、方法
- p.apply_async(调用的目标,传递的值)——异步非阻塞,不同等待当前进程执行,随时根据系统调度来进行程序切换,如果异步提交任务,等进程池内任务处理完,需要用get()来收集结果.
- p.close()——关闭进程池
- p.join()——主进程阻塞,等待所有工作进程退出,只能再close()后调用