gpt4 book ai didi

python - Python 的 asyncio.coroutine 可以看作是一个生成器吗?

转载 作者:太空狗 更新时间:2023-10-30 00:10:33 24 4
gpt4 key购买 nike

我用谷歌搜索了 python 协程,只看到了生成器(几乎所有示例都使用 yield 而没有 asyncio。)

它们真的一样吗?

asyncio.coroutine 和生成器有什么区别?

最佳答案

Python 中的大多数协程实现(包括 asynciotornado 提供的协程)都是使用生成器实现的。自PEP 342 - Coroutines via Enhanced Generators以来就是这种情况。使得将值发送到正在运行的生成器对象成为可能,这使得实现简单的协程成为可能。从技术上讲,协程生成器,它们只是设计用于以非常不同的方式使用。事实上,asyncio 的 PEP explicitly states this :

A coroutine is a generator that follows certain conventions.

asyncio.coroutine 一个生成器。从字面上看:

>>> import asyncio
>>> @asyncio.coroutine
... def mycoro():
... yield from asyncio.sleep(1)
...
>>> a = mycoro()
>>> a
<generator object mycoro at 0x7f494b5becf0>

同样,不同之处在于这两种东西的使用方式。尝试像普通生成器一样遍历 asyncio.coroutine 是行不通的:

>>> next(a)
Future<PENDING>
>>> next(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in mycoro
File "/usr/lib/python3.4/asyncio/tasks.py", line 548, in sleep
return (yield from future)
File "/usr/lib/python3.4/asyncio/futures.py", line 349, in __iter__
assert self.done(), "yield from wasn't used with future"
AssertionError: yield from wasn't used with future

显然,您并不打算对其进行迭代。你只是想 yield from 它,或者使用 asyncio.create_taskasyncio.async 将它注册到 asyncio 事件循环

正如我之前提到的,从 PEP 342 开始就可以使用生成器实现协程,这比 asyncioyield from 出现还早;该功能是在 2005 年添加的。asyncioyield from 只是添加了使编写协程更容易的功能。

关于python - Python 的 asyncio.coroutine 可以看作是一个生成器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29752502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com