Iteration 异常。
为此我们新建一个函数,这个函数传入一个协程列表,函数执行这些协程直到全部结束。我们现在要做的就是调用这个函数。
def run(coros):
? ? coros = list(coros)
? ? while coros:
? ? ? ? # Duplicate list for iteration so we can remove from original list.
? ? ? ? for coro in list(coros):
? ? ? ? ? ? try:
? ? ? ? ? ? ? ? coro.send(None)
? ? ? ? ? ? except StopIteration:
? ? ? ? ? ? ? ? coros.remove(coro)
这段代码每次从协程列表里取一个协程执行,如果捕获到 StopIteration 异常,就把这个协程从队列里去掉。
接下来我们把手工调用 send 的代码去掉,代码如下:
c1 = coro1()
c2 = coro2()
run([c1, c2])
综上所述,在 Python 3.5,我们现在可以通过新的 await 和 async 功能很轻松的执行协程。本文的相关代码可以在 github 上找到。
下面关于Python的文章您也可能喜欢,不妨看看:
英文原文:Playing around with await/async in Python 3.5