首页 > 编程语言 > 详细

python进程池

时间:2020-02-17 23:18:55      阅读:81      评论:0      收藏:0      [点我收藏+]

python进程池

当程序中需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。

初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务。

一.进程池

  • 引入进程池:from multiprocessing import Pool

  • 创建进程池 : pool=Pool( numprocess , initializer , initargs )

  • 参数:numprocess:要创建的进程池中包含的进程数。(省略的话,默认cpu_count()+1个)
    • initializer:每个工作进程启动时要执行的可调用对象,默认None
    • initargs:要传递给initializer的参数组

pool类包含的实例化方法:

  • 实例化一个进程池:pool=Pool(10)

  • pool.apply(func,args=()):同步的效率,即进程中的进程一个一个地去执行任务。上一个没执行完,下一个不会执行 func为进程要执行的目标函数 args为参数,是传递给任务函数的参数。
  • 当使用此种同步出来方法时,进程池不需要close和join,并且进程池中的所有进程都是普通进程(主进程等待其执行完毕后才会结束)

import multiprocessing
import time
def func(num):
    num+=1
    time.sleep(0.2)
    return num
def main():
    start_time=time.time()
    pool=multiprocessing.Pool(5)
    start=time.time()
    for i in range(20):
        res=pool.apply(func,args=(i)) #调用同步方法 会直接返回目标函数的返回值
        print(res,end=' ')
    end_time=time.time()
    total_time=end_time-start_time
    print('\n',total_time)
output:
1 2 3 4 5 6 7 8 9 10 
 2.535144805908203

2.pool.apply_async(func,args=(),callback=None)

  • func:目标函数

  • args:传递给目标函数的参数

  • callback:回调函数。每当进程池中有进程处理完任务,返回了函数的返回值可以交给回调函数处理。回调函数只有异步才有,同步没有。(此处该方法会返回一个进程函数对象,该对象调用get方法可以得到回调函数处理的结果) (暂时还没找到对于这个回调函数更好的解释,以后看官方文档再来补齐)

case:

import multiprocessing
import time
def func(num):
    num+=1
    time.sleep(0.2)
    return num
def main():
    l=[]
    start_time=time.time()
    pool=multiprocessing.Pool(5)
    start=time.time()
    for i in range(20):
        res=pool.apply_async(func,args=(i,)) 
        l.append(res)
    p.close()
    p.join()   #此处必须设置.join() 否则进程池中进程全部为守护进程
    for i in l:
        print(i.get(),end=' ')
    end_time=time.time()
    total_time=end_time-start_time
    print('\n',total_time)
output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
 1.423081398010254

可以很明显看出,异步的进程池效率比同步的要高。

对于进程池中的消息队列,其创建方式也有一点变化:

import multiprocessing   #导入模块
pool=multiprocessing.Pool() #创建进程池
queue=multiprocessing.Manager().Queue() #创建进程中的消息队列

暂时对于python中进程池的笔记到这里,以后的生产生活中我会继续学习。

python进程池

原文:https://www.cnblogs.com/magicdata/p/12323657.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!