python asyncio_理解Python asyncio内部实现机制

这里我不禁想问,为什么大年夜家没有一开端就想到 async/await 的方法呢?我的一个假设是 async/await 是须要说话本身的支撑的,而写编译器/说冥器的专家不必定有编写竽暌功用的丰富经验,是很可能大年夜一开端就拒绝如许的修改的。是以法度榜样员们只能本身用库的情势添加支撑了。当然这纯粹是猜测,只想感慨下不合范畴的隔阂。

总而言之,有了 event loop 我们就能经由过程回调函数来完成异步编程,但这种方法异常不友爱,是以人们又提出了类似 Promise 的思惟,让我们能次序编写异步代码,最后经由过程说话对 async/await 的语法支撑,异步与同步代码的构培养几乎达到同一。这种同一有很重要的意义,它使我们能以同步的思维去懂得异步的代码而不受回调方法的代码构造的影响。

而这一切都是为了将不合的异步函数“链接”起来,只不过是 async/await 的方法最为便利。比较线程,操作体系是没有供给方法将不合的线程链接起来的,是以这种将不合的协程链接起来的对象是协程比线程好的一个方面。

高低文切换(恢复控制流)

这里举一个 Python 官方文档 的例子:import asyncio

async def compute(x, y):

print("Compute %s + %s ..."% (x, y))

await asyncio.sleep(1.0)

returnx + y

async def print_sum(x, y):

result = await compute(x, y)

print("%s + %s = %s"% (x, y, result))

loop = asyncio.get_event_loop()

loop.run_until_complete(print_sum(1, 2))

loop.close()

膳绫擎的代码的履行流程是:

988ac2e2cbc30272ea095c7060f92d5f.jpg-wh_651x-s_251459686.jpg

这里有两个问题:谁向 event loop 注册了事宜(及回调)?

法度榜样大年夜哪里恢复履行?

法度榜样大年夜 print_sum 开始履行,履行到 asyncio.sleep 时须要暂停,那么肯定是在 sleep 中向 event loop 注册了急鹞鲼事宜。那们问题来了,当法度榜样恢复履行时,它应当大年夜哪里恢复呢?

大年夜膳绫擎的流程图中,可以看见它是大年夜 print_sum 开端恢复,但如许的话, sleep 注册事宜时就须要知道是谁(即 print_sum )调用了它,如许才能在 callback 中指定大年夜 print_sum 开端恢复履行!

但如不雅不是大年夜 print_sum 恢复履行,那么一样的,大年夜 sleep 恢复履行后, sleep 须要知道接下来返回到什愦地位(即 compute 函数中的 await 地位), asyncio 又是若何做到这点的?

那么事实(代码实现)是如何的呢?

当我们把一个协程用 loop.run_until_complete (或其它类似办法)履行时, event loop 会把它担保成一个 Task 。当协程开端履行或被唤醒时,Task 的 _step 办法会被调用, 这里 它会调用 coro.send(None) 来履行/唤醒它担保着的协程。if excisNone:

# We use the `send` method directly, because coroutines

# don't have `__iter__` and`__next__` methods.

result = coro.send(None)

else:

result = coro.throw(exc)

留意到这老将 coro.send 的结不雅赋值给了 result ,那么它会返回什么呢?在我们这个例子中,协程链的最末尾是 asyncio.sleep ,我们看看 它的实现 :@coroutine

def sleep(delay, result=None, *, loop=None):

"""Coroutine that completes after a given time (in seconds)."""

if delay == 0:

yield

returnresult

if loop isNone:

推荐阅读

基本常识此方法多用于启动体系中的功能性应用,比如打德律风、发邮件、预览图片、应用默认浏览器打开一个网页等。1. App 的人口 Activity 与其 icon一个通俗的应用默认会有一小我口 Activ>>>详细阅读

地址:http://www.17bianji.com/lsqh/37131.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值