进程间的通信-Queue
可以使用multiprocessing模块的Queue实现了进程之间的数据传递,Queue本身是一个消息队列。
初始化Queue()对象时(例如:q=Queue()),若括号中没有指定最大可接收的消息数量,或数量为负值,那么就代表可接受的消息数量没有上限(直到内存的尽头)。
队列的基本操作
Queue.put():入队,放入数据
Queue.get():出队,取出数据
Queue.size():返回当前队列包含的消息数量
Queue.empty():如果队列为空,返回True,反之False ;
Queue.full():如果队列满了,返回True, 反之False。
进程操作队列,直接使用进程自带的Queue
进程池的构建
当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。
初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务。
概念
定于一个进程池,在里面放上固定数量的进程,有需求就拿池子中的进程来处理任务,处理完毕,进程并不关闭,而是将这个进程再放回池子中继续等待任务。
方法
p.apply_async(调用的目标,传递的值)——异步非阻塞,不同等待当前进程执行,随时根据系统调度来进行程序切换,如果异步提交任务,等进程池内任务处理完,需要用get()来收集结果.
p.close()——关闭进程池
p.join()——主进程阻塞,等待所有工作进程退出,只能再close()后调用