解决Python 进程池Pool中一些坑
1frommultiprocessingimportPool,Queue。
其中Queue在Pool中不起作用,具体原因未明。
解决方案:
如果要用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue,
与multiprocessing中的Queue不同
q=Manager().Queue()#Manager中的Queue才能配合Pool po=Pool()#无穷多进程
2使用进程池,在进程中调用io读写操作。
例如:
p=Pool() q=Manager().Queue() withopen('/home/cctv/data/stage_file/stage_{}.txt'.format(int(time.time())),'w')asw1: p.apply_async(write_json,args=(video_path,0,0.6,w1,q,i[0],))
这样也不会完成进程,只能把w放到具体的函数里面,不能通过参数调用
补充:python3进程池pool使用及注意事项
1.在python中使用进程池主要就是为了并行处理任务,缩短运行时间
2.经常使用方法:同步有apply(),map();异步的有apply_async(),map_async()
3.先看几个小例子
importtime frommultiprocessingimportPool test=[1,2,3,4,5,6,7,8] defrun(fn): time.sleep(1) returnfn*fn s=time.time() foriintest: run(i) e=time.time() print('直接循环执行时间:',e-s) pool=Pool(8) s=time.time() foriintest: pool.apply(run,(i,)) e=time.time() print('apply执行时间:',e-s) pool1=Pool(8) s=time.time() res=[] foriintest: r=[pool1.apply_async(run,(i,))] res.append(r) pool1.close() pool1.join() e=time.time() print([i.get()foriinr]) print('apply_async执行时间:',e-s) pool2=Pool(8) r=pool2.map(run,test) pool2.close() pool2.join() e1=time.time() print(r) print('map执行时间:',e1-e) pool3=Pool(8) pool3.map_async(run,test) pool3.close() pool3.join() e1=time.time() print('map_async执行时间:',e1-e)
执行结果
直接循环执行时间:8.004754781723022 apply执行时间:8.016774654388428 [64] apply_async执行时间:1.1128439903259277 [1,4,9,16,25,36,49,64] map执行时间:1.181443452835083 map_async执行时间:2.3679864406585693
除此之外,在写代码中,还涉及到变量的一些问题。就需要加锁~
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。