python await语句_玩转 Python 3.5 的 await/async

本文介绍了Python中的协程概念,通过async和await关键字,展示了普通函数如何转换为协程函数。协程在执行时并不立即运行,而是返回协程对象。要启动协程,需要使用send方法,但会引发StopIteration异常作为执行结束的标志。通过try-catch结构可以妥善处理这个异常,使得多个协程能够依次执行。协程的执行方式与生成器类似,它们都是通过特定的控制流机制来实现异步操作。
摘要由CSDN通过智能技术生成

通过新的 async 关键字的魔法,这些函数不再是函数了,现在它们变成了协程(更准确的说是本地协程函数)。普通函数被调用的时候,函数体会被执行,但是在调用协程函数的时候,函数体并不会被执行,你得到的是一个协程对象:

c1 = coro1()

c2 = coro2()

print(c1, c2)

输出:

(解释器还会打印一些运行时的警告信息,先忽略掉)。

那么,为什么要有一个协程对象?代码到底如何执行?执行协程的一种方式是使用 await 表达式(使用新的 await 关键字)。你可能会想,可以这样来做:

await c1

不过,你肯定会失望了。await 表达式只有在本地协程函数里才是有效的。你必须这样做:

async def main():

await c1

接下来问题来了,main 函数又是如何开始执行的呢?

关键之处是协程确实是与 Python 的生成器非常相似,也都有一个 send 方法。我们可以通过调用 send 方法来启动一个协程的执行。

c1.send(None)

这样我们的第一个协程终于可以执行完成了,不过我们也得到了一个讨厌的 StopIteration 异常:

C1: Start

C1: Stop

Traceback (most recent call last):

File "test3.py", line 16, in

c1.send(None)

StopIteration

StopIteration 异常是一种标记生成器(或者像这里的协程)执行结束的机制。虽然这是一个异常,但是确实是我们期望的!我们可以用适当的 try-catch 代码将其包起来,这样就可以避免错误提示。接下来我们让我们的第二个协程也执行起来:

try:

c1.send(None)

except StopIteration:

pass

try:

c2.send(None)

except StopIteration:

pass

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值