当前位置: 首页 > news >正文

定远县建设小学网站/抖音seo优化系统招商

定远县建设小学网站,抖音seo优化系统招商,建站程序选择,电商网站开发商2019独角兽企业重金招聘Python工程师标准>>> 在实际使用多进程的时候,可能需要获取到子进程运行的返回值。如果只是用来存储,则可以将返回值保存到一个数据结构中;如果需要判断此返回值,从而决定是否继续执行所有子进程…

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

在实际使用多进程的时候,可能需要获取到子进程运行的返回值。如果只是用来存储,则可以将返回值保存到一个数据结构中;如果需要判断此返回值,从而决定是否继续执行所有子进程,则会相对比较复杂。另外在Multiprocessing中,可以利用Process与Pool创建子进程,这两种用法在获取子进程返回值上的写法上也不相同。这篇中,我们直接上代码,分析多进程中获取子进程返回值的不同用法,以及优缺点。

初级用法(Pool)

目的:存储子进程返回值

说明:如果只是单纯的存储子进程返回值,则可以使用Pool的apply_async异步进程池;当然也可以使用Process,用法与threading中的相同,这里只介绍前者。

实例:当进程池中所有子进程执行完毕后,输出每个子进程的返回值。

from multiprocessing import Pool
def test(p):     return p
if __name__=="__main__":pool = Pool(processes=10)result=[]for i  in xrange(50000):'''for循环执行流程:(1)添加子进程到pool,并将这个对象(子进程)添加到result这个列表中。(此时子进程并没有运行)(2)执行子进程(同时执行10个)'''result.append(pool.apply_async(test, args=(i,)))#维持执行的进程总数为10,当一个进程执行完后添加新进程.       pool.join()'''遍历result列表,取出子进程对象,访问get()方法,获取返回值。(此时所有子进程已执行完毕)'''for i in result:print i.get()

错误写法:

for i  in xrange(50000):t=pool.apply_async(test, args=(i,)))print t.get()

说明:这样会造成阻塞,因为get()方法只能等子进程运行完毕后才能调用成功,否则会一直阻塞等待。如果写在for循环内容,相当于变成了同步,执行效率将会非常低。

高级用法(Pool)

目的:父进程实时获取子进程返回值,以此为标记结束所有进程。

实例(一)

执行子进程的过程中,不断获取返回值并校验,如果返回值为True则结果所有进程。

from multiprocessing import Pool
import Queue
import time
def test(p):time.sleep(0.001)if p==10000:return Trueelse:return False
if __name__=="__main__":pool = Pool(processes=10)q=Queue.Queue()for i  in xrange(50000):'''将子进程对象存入队列中。'''q.put(pool.apply_async(test, args=(i,)))#维持执行的进程总数为10,当一个进程执行完后添加新进程.       '''因为这里使用的为pool.apply_async异步方法,因此子进程执行的过程中,父进程会执行while,获取返回值并校验。'''while 1:if q.get().get():pool.terminate() #结束进程池中的所有子进程。breakpool.join()

说明:总共要执行50000个子进程(并发数量为10),当其中一个子进程返回True时,结束进程池。因为使用了apply_async为异步进程,因此在执行完for循环的添加子进程操作后(只是添加并没有执行完所有的子进程),可以直接执行while代码,实时判断子进程返回值是否有True,有的话结束所有进程。

优点:不必等到所有子进程结束再结束程序,只要得到想要的结果就可以提前结束,节省资源。

不足:当需要执行的子进程非常大时,不适用,因为for循环在添加子进程时,要花费很长的时间,虽然是异步,但是也需要等待for循环添加子进程操作结束才能执行while代码,因此会比较慢。

实例(二)

多线程+多进程,添加执行子进程的过程中,不断获取返回值并校验,如果返回值为True则结果所有进程。

from multiprocessing import Pool
import Queue
import threading
import time
def test(p):time.sleep(0.001)if p==10000:return Trueelse:return False
if __name__=="__main__":result=Queue.Queue() #队列pool = Pool()def pool_th():for i  in xrange(50000000): ##这里需要创建执行的子进程非常多try:result.put(pool.apply_async(test, args=(i,)))except:breakdef result_th():while 1:a=result.get().get() #获取子进程返回值if a:pool.terminate() #结束所有子进程break'''利用多线程,同时运行Pool函数创建执行子进程,以及运行获取子进程返回值函数。'''t1=threading.Thread(target=pool_th)t2=threading.Thread(target=result_th)t1.start()t2.start()t1.join()t2.join()pool.join()

执行流程:利用多线程,创建一个执行pool_th函数线程,一个执行result_th函数线程,pool_th函数用来添加进程池,开启进程执行功能函数并将子进程对象存入队列,而result_th()函数用来不停地从队列中取子进程对象,调用get()方法获取返回值。等发现其中存在子进程的返回值为True时,结束所有进程,最后结束线程。

优点:弥补了实例(一)的不足,即使for循环的子进程数量很多,也能提高性能,因为for循环与判断子进程返回值同时进行。

转载于:https://my.oschina.net/liuyuantao/blog/1154506

http://www.lbrq.cn/news/42391.html

相关文章:

  • 网站做长连接/公司做网络推广怎么做
  • wordpress 插件卸载/河南网站优化排名
  • 易语言做网站登录器/百度点击器找名风
  • 北京网站搭建公司电话/搜索引擎的工作原理分为
  • 网站开发与技术维护/优化设计七年级下册语文答案
  • 自己如何做网站推广/淘宝运营培训班学费大概多少
  • 杭州网站建设优化/网站seo课程
  • 哪个网站有做彩平的材质贴图/合肥网站推广公司哪家好
  • email网站注册/百度网址是什么
  • 嵊州做网站/seo入门教程
  • 龙岩网站建设哪里比较好/今日头条新闻下载安装
  • 政府网站建设的重要性/渠道推广费用咨询
  • 电脑做兼职找那个网站/百度快照是怎么做上去的
  • 做户外灯批发什么b2b网站好/发软文
  • 扬州做网站的公司/seo优化教学视频
  • 网站获取访客qq号码/合肥关键词排名优化
  • ecshop做企业网站/百度搜索流量查询
  • 网站 手机版网站开发合同/做seo需要哪些知识
  • 郑州做品牌网站的公司/深圳网络营销策划有限公司
  • 网站建设标书范本/百度下载软件
  • 网站建设与运营公司财务预算/台州seo网站排名优化
  • 怎么做徐州市环保局网站备案表/全国十大跨境电商排名
  • 垂直门户网站建设/杭州百度快照优化排名
  • 户外做爰网站/免费的黄冈网站有哪些平台
  • 阿里云个人网站备案/重庆可靠的关键词优化研发
  • 海曙网站建设网站/seo门户网
  • dw软件做的网站怎么发到网上/优化公司排行榜
  • 服装设计手稿/seo是什么意思seo是什么职位
  • 微信网站开发登录/百度学术搜索入口
  • 微信公众号功能模块/上海关键词排名优化怎样
  • web后端开发(javaweb第十天)
  • 如何轻松玩转多线程高并发?
  • SVG基础语法:绘制点线面的简单示例
  • Electron实现“仅首次运行时创建SQLite数据库”
  • MAC 苹果版Adobe Photoshop 2019下载及保姆级安装教程!!
  • UniApp 多端人脸认证图片上传实现