上一次学到了如何使用multithreading中的Process创建多个进程,现在来看一下如何使用multithreading模块中的Pool类即Pool进程池创建进程。
首先来看一下Pool类的常用方法:
apply_async(func[,args[,kwds]]):使用非阻塞方式调用func,并行执行,args为传递给func的函数,kwds表示传递给func的关键字参数列表。
apply(func[,args[,kwds]]) : 使用阻塞方式调用func
close() : 关闭Pool,使其不再接受新的任务
terminate() : 不管任务是否完成,立即终止
join() : 主进程阻塞,等待子进程的推出,必须在close()或者terminate之后使用
所谓的阻塞就是指必须在某一任务完成之后才能继续执行这一任务,也就是I/O事件导致线程挂起,需要等待I/O事件完成之后才能进行任务调度来执行这个任务。
示例代码如下:
1 | from multiprocessing import Pool |
在某些程序中需要进程之间的相互通信,那么如何才能实现进程间的相互通信呢?
Python中multiprocessing模块包装了底层的机制,提供了Queue、Pipes管道等多种方式来交换数据。队列是一种数据结构,先进先出的数据结构。进程之间有时需要通信,操作系统提供了很多机制实现进程间的通信,可以使用multiprocessing模块的Queue实现多进程之间的数据结构。
Queue对象常用的函数如下:
Queue.qsize() :返回当前队列包含的消息数量
Queue.empty() : 如果队列为空,返回True,反之返回False
Queue.full() :如果队列满了True否则返回False
Queue.get([block[,timeout]]): 获取队列中的消息,然后将其从队列中移除,block默认值为True.如果block使用默认值,且没有设置timeout,消息队列为空则会被阻塞,直到从消息队列中读到消息位置,如果设置了timeout,就会等待timeout秒,若还为空则会抛出Queue.Empty异常;如果block为False,消息队列为空则立刻抛出Queue.Empty
Queue.get_nowait() :相当于Queue.get(False)
Queue.put(item,[block[,timeout]]):将item消息写入队列,block默认为True;如果block使用默认值,且没有设置timeout,消息无法写入则会被阻塞,直到从消息队列中有空间写入,如果设置了timeout,就会等待timeout秒,若还没有空间则会抛出Queue.Full异常;如果block为False,消息队列为空则立刻抛出Queue.Full异常
Queue.put_nowait(item) : 相当于Queue.put(item,False)
下面是一个利用multiprocessing.Process可以创建多进程,使用multiprocessing.Queue可以实现队列的操作:
1 | from multiprocessing import Process,Queue |