python

来源:互联网 发布:擂台算法自然语言 编辑:程序博客网 时间:2024/06/08 07:47

进程池Pool

当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态生成多个进程,此时就可以使用multiprocessing模块提供的Pool方法。初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,
如果池还没有满,那么就会创建一个新的进程来执行该请求;但如果池中
的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来执行,请看下面的实例:
代码如下:

#coding=utf-8from multiprocessing import Poolimport os, time, randomdef worker(msg):    print('%s子进程%d开始执行'%(msg,os.getpid()))    t_start = time.time()    time.sleep(random.random()*10)    t_end = time.time()    print('%s执行结束,耗时%.2f'%(msg, t_end - t_start))#创建一个进程池,最大进程数为3po = Pool(3)for i in range(0,10):    # Pool.apply_async(要调用的目标,(传递给目标的参数元祖,))    # 每次循环将会用空闲出来的子进程去调用目标    po.apply_async(worker,(i,))print('---开始---')po.close() #关闭进程池,关闭后po不再接收新的请求po.join() #等待po中所有子进程执行完毕,必须放在close语句之后print('---结束---')

运行结果:

---开始---0子进程5480开始执行1子进程5481开始执行2子进程5482开始执行2执行结束,耗时2.903子进程5482开始执行1执行结束,耗时4.814子进程5481开始执行0执行结束,耗时5.835子进程5480开始执行5执行结束,耗时0.826子进程5480开始执行3执行结束,耗时4.047子进程5482开始执行6执行结束,耗时3.548子进程5480开始执行4执行结束,耗时5.629子进程5481开始执行8执行结束,耗时1.247执行结束,耗时6.269执行结束,耗时7.68---结束---

multiprocessing.Pool常用函数解析:

apply_async(func[, args[, kwds]]) :使用非阻塞方式调用func(并行执
行,堵塞方式必须等待上一个进程退出才能执行下一个进程),args为
传递给func的参数列表,kwds为传递给func的关键字参数列表;
apply(func[, args[, kwds]]):使用阻塞方式调用func
close():关闭Pool,使其不再接受新的任务;
terminate():不管任务是否完成,立即终止;
join():主进程阻塞,等待子进程的退出, 必须在close或terminate之后
使用;

apply堵塞式

#coding=utf-8from multiprocessing import Poolimport os, time, randomdef worker(msg):    print('%s子进程%d开始执行'%(msg,os.getpid()))    t_start = time.time()    time.sleep(random.random()*10)    t_end = time.time()    print('%s执行结束,耗时%.2f'%(msg, t_end - t_start))#创建一个进程池,最大进程数为3po = Pool(3)for i in range(0,10):    # Pool.apply_async(要调⽤的⽬标,(传递给⽬标的参数元祖,))    # 每次循环将会⽤空闲出来的⼦进程去调⽤⽬标    po.apply(worker,(i,))print('---开始---')po.close() #关闭进程池,关闭后po不再接收新的请求po.join() #等待po中所有⼦进程执⾏完成,必须放在close语句之后print('---结束---')

运行结果:

0子进程5546开始执行0执行结束,耗时3.871子进程5547开始执行1执行结束,耗时4.592子进程5548开始执行2执行结束,耗时8.053子进程5546开始执行3执行结束,耗时7.614子进程5547开始执行4执行结束,耗时3.445子进程5548开始执行5执行结束,耗时9.706子进程5546开始执行6执行结束,耗时5.497子进程5547开始执行7执行结束,耗时4.258子进程5548开始执行8执行结束,耗时8.259子进程5546开始执行9执行结束,耗时4.64---开始------结束---