python进程池

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中进程池的笔记到这里,以后的生产生活中我会继续学习。

posted @ 2020-02-17 21:06  Magic-Dater  阅读(464)  评论(0)    收藏  举报