大纲
1 | python多进程简述 |
python多进程模块简述:
python由于GIL机制,多线程,实际仅消耗一个内核资源;因此效率较低,python要实现并发,提高性能,只能使用多进程模块,python的多进程模块为multiprocessing,通过使用Pool类实现多进程;
python多进程模块方法介绍:
python多进程模块为multiprocessing,为python的内置模块;通过该模块封装的Pool()对象实现多进程,Pool类的属性介绍如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14from multiprocessing import Pool
run=run() #需要被执行的方法/任务
iter=iter #迭代对象,list/变量值
pool=Pool(3) #创建一个仅容纳3个进程的进程池,一旦工作任务超出进程的数量,则需等待,进程池中的进程被释放,任务才能进入进程池;
__init__(self, group=None, target=None, name=None, args=(), kwargs={}) #进程池的构造方法
group:进程池所属的进程组,一旦不需要给值;
target:待处理的任务或方法;
name:进程池的别名,默认不给值;
args:调用对象的位置参数,可给值元组/列表等可迭代对象或者参数值;
kwargs:调用对象的字典参数;
使用:在win环境下,进程池必须在当前模块下执行,即必须在 if __name__==main:下执行;- Pool()类中拥有的属性方法如下:
- pool.map()
1
2
3
4函数原型:map(func, iterable[, chunksize=None])
pool.map(run,iter) #使用进程池中的进程来同步构造任务为run,参数为iter的对象,具体效果等同于map()方法;
pool.close() #通过主进程,关闭进程池,子进程任务未完成时,进程池不能接受新的子进程;
pool.join() $通过执行子进程,并等待所有子进程执行完,才进行下一步操作; - pool.map_async(run,iter)
1
2
3
4
5函数原型:map_async(func, iterable[, chunksize=None])
pool.map_async(run,iter) #使用进程池中的进程来同步构造任务为run,参数为iter的对象,具体效果等同于map()方法;
pool.close() #通过主进程,关闭进程池,子进程任务未完成时,进程池不能接受新的子进程;
pool.join() $通过执行子进程,并等待所有子进程执行完,才进行下一步操作;
---效果和pool.map()不相同,mapasyc效率更高;mapasyc主进程未阻塞进程池,不需要等该批次的进程全执行完,新的任务就能进入进程池执行;常用pool.map() - pool.apply()
1
2
3函数原型:apply(func[, args=()[, kwds={}]])
apply,参数需要为具体的变量值,且仅在python2支持;
apply方法的原理是,阻塞进程池,一次仅让一个任务进入进程池,该任务完成后,才能执行下一个任务,实际是串行; - pool.applyasyc()
1
2
3
4
5函数原型:apply(func[, args=()[, kwds={}]],[, callback=None]]])
applyasyc,参数需要为具体的变量值,在python3上支持;
applyasyc方法的原理是,进程池非阻塞,一次可以让多个任务进入进程池,且未对该批次任务进行阻塞,只要其中一个进程执行完后,就能释放资源,让新的任务进入进程池,实际是并行的,效率等同于mapasyc();
回调使用:pool.applyasyc(run,kwargs,callback=func2),run的返回作为func2的参数,执行完返回func2的值;
---applyasyc效果等同于mapasyc(),只是他具有回调功能,且入参的变量不能是可迭代对象,必须为具体的变量值; - pool.terminal()
1
2
3
4
5
6作用:结束工作进程,不在处理未完成的任务
pool.map(run,iter)
pool.close()
pool.run()
sleep(2)
pool.terminal() #执行两秒后,哪怕进程未执行完,也结束该主进程
python多进程使用:
1 | from multiprocessing import Pool |