python-3.x - asyncio.coroutine 和 types.coroutine 装饰器有什么区别?

标签 python-3.x python-asyncio coroutine

练习写作coroutines在Python 3.6中, 注意到两者都在:

from asyncio import coroutine

并且在:

from types import coroutine

有 2 个装饰器,乍一看它们的作用是一样的..

阅读第一个文档(来自 asyncio )

Decorator to mark coroutine

第二个(来自 types ):

Convert regular generator function to coroutine.

让我更困惑了.. 我知道我可以使用 async yield from在python3.6中,所以我迷失了真正理解两者之间的区别。

请帮忙

最佳答案

随着 async def 的出现语法,这两个装饰器都很少使用,并且 asyncio.coroutine正式deprecated .

types.coroutine装饰器作为从生成器创建协程的低级工具仍然很有用。在为自定义事件循环实现制作原语时,这种事情很有用。与@types.coroutine您可以从准系统生成器创建一个协程,其 yield直接向事件循环生成您选择的值。

例如,sleep协程实现可能如下所示:

@types.coroutine
def sleep(delay):
    deadline = time.time() + delay
    yield 'sleep_until', deadline

这将创建一个与使用async def创建的协程类似的协程。 ,但具有与兼容事件循环通信的神奇能力,其中可能包含如下代码:

def run(self):
    while self._to_run:
        coro = self._to_run.popleft()
        try:
            cmd, arg = coro.send(None)
        except StopIteration:
            continue
        if cmd == 'sleep_until':
            self._to_wake[arg] = coro
    time.sleep(min(self._to_wake) - time.time())
    self._to_run.extend(coro for t, coro in self._to_wake.items()
                        if t <= time.time())

有关更多详细信息,请参阅this lecture由 David Beazley 制作,在现场观众面前构建了一个功能齐全的事件循环。 (不要因 yield from 的使用而推迟 - 较新的 async def 的工作方式完全相同。)

关于python-3.x - asyncio.coroutine 和 types.coroutine 装饰器有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54096520/

相关文章:

postgresql - 如何将 Odoo 与 postgres 连接(在其他服务器上运行)

python-3.x - 模板匹配 : efficient way to create mask for minMaxLoc?

python - 在 asyncio.Protocol.data_received 中调用协程

python-3.x - Python 跨不同类的 asyncio.Event()

python - 我在输出中得到的模式末尾有额外的星号,这是不需要的

Python 异步等待任务

javascript - 生成具有延续性的Javascript代码的诀窍是什么?

c++ - make_fcontext/jump_fcontext 与共享堆栈一起使用

parsing - 将子例程放入解析器的优雅方法是什么?

python - 将 Django 1.8 项目代码更新/升级到 Django 2.0