python多进程multiprocessing Pool
Pool介绍
Multiprocessing.Pool
可以提供指定数量的进程供用户调用,当有新的请求提交到pool
中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来执行它。在共享资源时,只能使用Multiprocessing.Manager
类,而不能使用Queue
或者Array
。
构造方法
- Pool([processes[, initializer[, initargs[, maxtasksperchild[, context]]]]])
- processes :使用的工作进程的数量,如果
processes
是None
那么使用os.cpu_count()
返回的数量。 - initializer: 如果
initializer
是None
,那么每一个工作进程在开始的时候会调用initializer(*initargs)
。 - maxtasksperchild:工作进程退出之前可以完成的任务数,完成后用一个新的工作进程来替代原进程,来让闲置的资源被释放。
maxtasksperchild
默认是None
,意味着只要Pool
存在工作进程就会一直存活。 - context: 用在制定工作进程启动时的上下文,一般使用
multiprocessing.Pool()
或者一个context
对象的Pool()
方法来创建一个池,两种方法都适当的设置了context
。
实例方法
- apply_async(func[, args[, kwds[, callback]]]) 它是非阻塞。
- apply(func[, args[, kwds]])是阻塞的。
- close() 关闭
pool
,使其不在接受新的任务。 - terminate() 关闭
pool
,结束工作进程,不在处理未完成的任务。 - join() 主进程阻塞,等待子进程的退出,
join
方法要在close
或terminate
之后使用。
Pool使用方法
Pool+map函数
说明:此写法缺点在于只能通过map
向函数传递一个参数。
|
|
异步进程池(非阻塞)
|
|
执行顺序:For
循环内执行了2个步骤,第一步:将500
个对象放入进程池(阻塞)。第二步:同时执行10
个子进程(非阻塞),有结束的就立即添加,维持10
个子进程运行。(apply_async
方法的会在执行完for
循环的添加步骤后,直接执行后面的print
语句,而apply
方法会等所有进程池中的子进程运行完以后再执行后面的print
语句)
注意:调用join
之前,先调用close
或者terminate
方法,否则会出错。执行完close
后不会有新的进程加入到pool
,join
函数等待所有子进程结束。
同步进程池(阻塞)
|
|
说明:for
循环内执行的步骤顺序,往进程池中添加一个子进程,执行子进程,等待执行完毕再添加一个子进程…..等500
个子进程都执行完了,再执行print “test”
。(从结果来看,并没有多进程并发)
相关文章
【Multiprocessing系列】共享资源
【Multiprocessing系列】子进程返回值
【Multiprocessing系列】Pool
【Multiprocessing系列】Process
【Multiprocessing系列】Multiprocessing基础