#yyds干货盘点#python协程

网友投稿 340 2022-09-06


#yyds干货盘点#python协程

Python的协程源于yield指令。yield有两个功能:

yield item用于产出一个值,反馈给next()的调用方。作出让步,暂停执行生成器,让调用方继续工作,直到需要使用另一个值时再调用next()。

import asyncioasync def compute(x, y): print("Compute %s + %s ..." % (x, y)) await asyncio.sleep(x + y) return x + yasync def print_sum(x, y): result = await compute(x, y) print("%s + %s = %s" % (x, y, result))loop = asyncio.get_event_loop()tasks = [print_sum(1, 2), print_sum(3, 4)]loop.run_until_complete(asyncio.wait(tasks))loop.close()

协程是对线程的调度,yield类似惰性求值方式可以视为一种流程控制工具,实现协作式多任务,在Python3.5正式引入了async/await表达式,使得协程正式在语言层面得到支持和优化,大大简化之前的yield写法。

线程是内核进行抢占式的调度的,这样就确保了每个线程都有执行的机会。

而 coroutine运行在同一个线程中,由语言的运行时中的 EventLoop(事件循环)来进行调度。

和大多数语言一样,在 Python 中,协程的调度是非抢占式的,也就是说一个协程必须主动让出执行机会,其他协程才有机会运行。

让出执行的关键字就是 await。也就是说一个协程如果阻塞了,持续不让出 CPU,那么整个线程就卡住了,没有任何并发。

简而言之,任何时候只有一个协程正在运行。

PS: 作为服务端,event loop最核心的就是IO多路复用技术,所有来自客户端的请求都由IO多路复用函数来处理;作为客户端,event loop的核心在于利用Future对象延迟执行,并使用send函数激发协程,挂起,等待服务端处理完成返回后再调用CallBack函数继续下面的流程


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python酒店,会议室预定系统
下一篇:spring cache注解@Cacheable缓存穿透详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~