异步编程 101:Python async await发展简史

本文介绍了Python异步编程的关键发展历程,从2.2的生成器开始,到2.5的send功能,3.3的yield from语法,3.4的asyncio模块,以及3.5引入的async/await关键字。通过示例解析了yield from和async/await的工作原理,并强调async/await是Python中协程的高级抽象,应当视为API而非具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文参考了:

  • How the heck does async/await work in Python 3.5?

  • PEP 380: Syntax for Delegating to a Subgenerator

yield 和 yield from

先让我们来学习或者回顾一下 yieldyieldfrom的用法。如果你很自信自己完成理解了,可以跳到下一部分。

Python3.3提出了一种新的语法: yieldfrom

yield from iterator

本质上也就相当于:

for x in iterator:	
    yield x

下面的这个例子中,两个 yieldfrom加起来,就组合得到了一个大的 iterable(例子来源于官网3.3 release):

>>> def g(x):	
...     yield from range(x, 0, -1)	
...     yield from range(x)	
...	
>>> list(g(5))	
[5, 4, 3, 2, 1, 0, 1, 2, 3, 4]

理解 yieldfrom对于接下来的部分至关重要。想要完全理解 yieldfrom,还是来看看官方给的例子:

def accumulate():	
    tally = 0	
    while 1:	
        next = yield	
        if next is None:	
            return tally	
        tally += next	
def gather_tallies(tallies):	
    while 1:	
        tally = yield from accumulate()	
        tallies.append(tally)	
tallies = []	
acc = gather_tallies(tallies)	
next(acc) # Ensure the accumulator is ready to accept values	
for i in range(4):	
    acc.send(i)	
acc.send(None) # Finish the first tally	
for i in range(5):	
    acc.send(i)	
acc.send(None) # Finish the second tally	
print(tallies)

我还专门为此录制了一段视频,你可以配合文字一起看,或者你也可以打开 pycharm 以及任何调试工具,自己调试一下。 点击原文可查看视频。

来一起 break down:

acc=gather_tallies(tallies)这一行开始,由于 gather_tallies函数中有一个 yield,所以不会 while1立即执行(你从视频中可以看到,acc 是一个 generator 类型)。

next(acc)

next()会运行到下一个 yield,或者报StopIteration错误。

next(acc)进入到函数体gathertallies,gathertallies中有一个 yieldfromaccumulate(),next(acc)不会在这一处停,而是进入到『subgenerator』accumulate里面,然后在 next=yield处,遇到了 yield,然后暂停函数,返回。

for i in range(4):	
    acc.send(i)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值