



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
python3协程数量限制_多任务(3):协程代码环境:python3.6上⼀篇⽂章我们讲了python中多线程的使⽤:点击阅读,现在我们讲讲python中的协程。异步IO我们知道,CPU速度远远快于磁盘、⽹络等IO。在IO编程中,假如⼀个IO操作阻塞了当前线程,会导致其他代码⽆法执⾏,所以我们使⽤多线程或者多进程来并发执⾏代码。但是,系统资源是有限的,⼀旦线程数量过多,CPU的时间就花在线程切换上了,真正执⾏代码的时间下降,导致性能严重下降。针对这个问题,我们需要另⼀种解决⽅法:异步IO。异步IO,即当代码需要执⾏⼀个耗时的IO操作时,它只发出IO指令,并不等待IO结果,然后就去执⾏其他代码了。⼀段时间后,当IO返回结果时,再通知CPU进⾏处理。python中最初的协程了解最初的协程有助于我们理解后⾯现代协程的⽤法。协程这个概念并不是python⾸次提出的,⽽是从其他语⾔借鉴过来的。我们知道,两个普通函数的调⽤是按顺序的,⽐如A函数调⽤B函数,B执⾏完毕返回结果给A,A执⾏完毕。协程看上去也是函数,如果协程A调⽤协程B,在执⾏过程中,协程B可以中断,转⽽执⾏A,再在适当的时候返回B接着从中断处往下执⾏。协程的这种执⾏特点,恰好符合我们的需求:通过协程实现异步IO编程。⽣成器进化成协程python基于generator进⾏⼀系列功能改进后得到协程,语法上都是定义体中包含yield关键字。在协程中,yield不仅可以返回值,还能接收调⽤者通过.send()⽅法发出的参数。yield通常出现在表达式右边,如:data=yieldsomething。如果yield后⾯没有表达式,说明此时yield只负责接收数据,协程始终返回None。简单协程的基本⾏为举个简单例⼦:In[1]:defmy_coroutine():...:print('协程被激活')...:whileTrue:#yield后⾯不跟表达式,这⾥只接收send()传过来的数据...:x=yield...:print(f'协程接收到参数:{x}')...:In[2]:my_corou=my_coroutine()#可查看协程当前状态In[3]:frominspectimportgetgeneratorstateIn[4]:getgeneratorstate(my_corou)Out[4]:'GEN_CREATED'
#激活协程,此处可⽤my_corou.send(None)代替In[5]:next(my_corou)协程被激活In[6]:getgeneratorstate(my_corou)Out[6]:'GEN_SUSPENDED'In[7]:return_value=my_corou.send(99)协程接收到参数:99In[8]:print(return_value)NoneIn[9]:my_corou.close()In[10]:getgeneratorstate(my_corou)Out[10]:'GEN_CLOSED'通过例⼦我们主要了解的是,协程需要⼿动激活才能真正调⽤,协程在不需要的时候要记得关闭。⽤协程改进⽣产者-消费者模型传统⽣产者-消费者模型中,⼀个线程写消息,另⼀个线程取消息,通过锁机制控制队列和等待,但是⼀不⼩⼼可能死锁。如果改⽤协程,⽣产者⽣产消息后,直接通过yield跳转到消费者开始执⾏,待消费者执⾏完毕后,再切换回⽣产者继续⽣产,整个流程⽆锁且效率⾼:frominspectimportgetgeneratorstatedefconsumer():r='200OK'whileTrue:#yield接收⽣产者的数据赋值给n,并把处理结果状态r返回n=yieldrprint(f'[CONSUMER]消费了:{n}')defproducer(c):#别忘了激活协程c.send(None)n=0whilen<5:n=n+1print(f'[PRODUCER]⽣产了:{n}')#⼀旦⽣产了东西,通过c.send()切换到consumer执⾏#consumer处理数据后通过yield返回结果状态,这⾥获取返回内容r=c.send(n)
print(f'[PRODUCER]消费者返回的处理结果:{r}')print(f'⽣产者不⽣产了,看看当前consumer状态:{getgeneratorstate(c)}')c.close()print(f'关闭consumer,看看当前consumer状态:{getgeneratorstate(c)}')if__name__=="__main__":producer(consumer())上⾯例⼦整个流程只由⼀个线程执⾏且⽆锁,⽣产者和消费者协作完成任务,这种属于协作式多任务,跟多线程这种抢占式多任务要区分开。asyncio在python3.4版本中,开始引⼊标准库asyncio直接内置了对异步IO的⽀持。asyncio的编程模型就是⼀个消息循环。我们从asyncio模块中直接获取⼀个EventLoop的引⽤,然后把需要执⾏的协程扔到EventLoop中执⾏,就实现了异步IO。先简单介绍下asyncio涉及到的⼀些词语:Future:⼀个对象,表⽰异步执⾏的操作。通常情况下⾃⼰不应该创建Future,⽽只能由并发框架如asyncio实例化。Task:在EventLoop中负责执⾏协程的任务,是Future的⼦类。换句话说,Task就是Future,但反过来不⼀定。下⾯是asyncio常⽤API:asyncio.get_event_loop():获取⼀个EventLoop对象,⽤来运⾏协程asyncio.iscoroutine(obj):判断⼀个对象是否是协程。asyncio.sleep(delay):直接当做是⼀个耗时多少秒的协程即可。asyncio.ensure_future(coro_or_future):⼊参是协程,则激活协程,返回⼀个Task对象;如果⼊参是Future,则将⼊参直接返回。asyncio.gather(coros_or_futures):按⼊参中协程的顺序保存协程的执⾏结果,⼤部分情况下使⽤。asyncio.wait(futures):对⽐gather,不⼀定按⼊参顺序返回执⾏结果。返回包含已完成和挂起的Task,可通过接收参数return_when选择返回结果的时机,按实际情况使⽤。我们将在下⾯结合新的关键字async/await来举例说明。async/await为了简化使⽤和标识异步IO,从python3.5版本开始引⼊新的语法糖async/await,⽤async把⼀个generator标记为协程函数,然后在协程内部⽤await调⽤另⼀个协程实现异步操作。注意:⽤async标记协程函数,调⽤该函数时协程尚未激活,激活该函数可以⽤await或者yieldfrom,也可以通过ensure_future()或者AbstractEventLoop.create_task()调度执⾏。举个例⼦:fromasyncioimportsleepasaiosleep,gather,get_event_loopasyncdefcompute(x,y):print("计算%s+%s..."%(x,y))awaitaiosleep(1)returnx+y
asyncdefprint_sum(x,y):result=awaitcompute(x,y)print("%s+%s=%s"%(x,y,result))asyncdefcoro_main():'''⼀般我们会写⼀个coroutine的main函数,专门负责管理协程'''awaitgather(print_sum(1,2),print_sum(4,9))defmain():aioloop=get_event_loop()#内部使⽤ensure_future()激活协程aioloop.run_until_complete(coro_main())aioloop.close()if__name__=="__main__":main()执⾏结果:计算1+2...计算4+9...(暂停约1秒,实际输出没有这⾏)1+2=34+9=13观察例⼦运⾏结果,我们看到:当协程开始计算1+2前还有⼀个耗时1秒的IO操作,当前线程并未等待,⽽是去执⾏其他协程计算4+9,实现了并发执⾏。协程结果按gather⼊参的顺序打印。总结⾯对CPU⾼速执⾏和IO设备的龟速严重不匹配问题,我们⾄少要知道两种解决⽅法:使⽤多进程和多线程并发执⾏代码;使⽤异步IO执⾏代码。python协程是基
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 证券从业资格证内容分析试题及答案
- 餐厅保洁托管方案范本
- 2025年会计实务应用试题及答案
- 医院净化工程施工方案
- 共享农田托管方案范本
- 项目管理工具对效率提升的影响考题及答案
- 2024年项目管理专业人士资格考试全新试题及答案
- 校园车牌订购方案范本
- 银行从业资格实践案例分享试题及答案
- 2024年项目管理效果评估试题及答案
- 广州有限责任公司章程范本
- 知识产权与人工智能
- 定向钻出入土点平面布置图(可编辑)
- 《心房颤动诊断和治疗中国指南2023》解读
- ANSYS导出柔性体MNF文件入ADAMS的详细步骤
- (完整版)200210号文-工程勘察设计收费标准(2002年修订本)本月修正2023简版
- 《骆驼祥子》知识竞赛题及答案
- 光学零件制造工艺
- 2024届高考语文复习-新高考卷文学类阅读真题《建水记》《大师》讲评
- 八年级道德与法治下册第一单元坚持宪法至上思维导图人教部编版
- 中考冠词专项训练100题 (带答案)
评论
0/150
提交评论