二十二:Python之多进程
程序:是一个指令的集合
进程:正在执行的程序;或者说,当你运行一个程序,你就启动了一个进程
多进程中,每个进程所有数据(包括全局变量)都各自拥有一份,互不影响
Python中使用多进程需要用到multiprocessing模块,这个模块中封装了很多多进程的方法。
Process常用方法
p.start():启动进程,并调用该子进程中的p.run()方法
p.run():进程启动时运行的方法,正式它去调用target指定的函数,我们自定义类的类中一定要实现该方法
p.terminate():强制终止进程,不会进行任何清理操作
p.js_alive():如果p仍然运行,返回True;用来判断进程是否还在运行
p.join([timeout]):主进程等待p终止,timeout是可选的超时时间
进程池
进程池:用来创建多个进程
当需要创建子进程数量不多时,可以直接利用multiprocessing中的Process动态生成多个进程,但如果是上百个上千个目标,手动的去创建进程的工作量巨大,此时就可以利用到multiprocessing模块提供的Pool。
初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果进程池还没满,那么就会创建一个新的进程来执行请求;但是如果进程池中的进程数达到了最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来执行。
Pool常用函数解析:
apply_async(self, func, args=(), kwds={}, callback=None, error_callback=None):使用非阻塞方式调用func(并行执行,堵塞方式为必须等待上一个进程退出后才执行下一个进程),args为传递给func的参数列表,kwds为传递给func的关键字参数列表
close():关闭Pool,使其不在接收新的任务
terminate():不管任务是否完成,立即终止
join():主进程堵塞,等待子进程的退出,必须在close活terminate之后
进程间通信-Queue
多进程之间,默认是不共享数据的
通过Queue(队列Q)可以实现进程间的数据传递
Q本身是一个消息队列
如何添加消息(入队操作):
可以使用multiprocessing模块的Queue实现多进程之间的数据传递
初始化Queue()对象时(例如:q = Queue() ),若括号中没有指定最大可接收的消息数量,或数量为负值,那么就代表可接收的消息没有上限
Queue.qsize():返回当前队列包含的消息数量
Queue.empty():如果队列为空,返回True
Queue.full():如果队列满了,返回True
Queue.get(block, timeout):获取队列中的一条消息,然后将其从队列中移除,block默认值为True
-如果block使用默认值,切没有设置timeout(单位秒),消息队列如果为空,此程序将被阻塞(停在读取状态),知道从消息队列读到消息为止,如果设置了timeout,则会等待timeout秒,若还是没有读取到消息,则抛出‘Queue.Empty’异常
-如果block值为False,消息队列如果为空,则会立刻抛出‘Queue.Empty’异常
进程池间通信-Queue
进程池创建的进程之间通信:如果要使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue,而不是multiprocessing.Queue()