为什么我要使用“async def”over`@异步协同程序`?

2024-04-26 14:44:15 发布

您现在位置:Python中文网/ 问答频道 /正文

python3.5通过新的函数定义语法大大扩展了对异步编程的支持。而异步函数以前只是“有好处的生成器”:

def generate_numbers():
    """
    Generator function that lazily returns 1 - 100
    """
    for i in range 100:
        yield i

generate_async = asyncio.coroutine(generate_numbers)
generate_async.__doc__ = """
    Coroutine that lazily returns 1 - 100
    This can be used interchangeably as a generator or a coroutine
    """

它们现在有自己的特殊声明语法和特殊行为,它们不再像通常的生成器函数那样可用:

^{pr2}$

这是一个关于这些类型之间功能或实际差异的问题,在this StackOverflow answer中讨论过。在

我的问题是:为什么我要使用async def?它似乎没有提供比@asyncio.coroutine更多的好处,但却增加了额外的成本

  1. 破坏向后兼容性(python3.5代码与async def 在旧版本中甚至不会解析parse,尽管这可以说是一个特性而不是bug)和
  2. 似乎在如何调用函数方面提供了较少的灵活性。在

Tags: 函数asyncioasyncthat定义def编程语法
1条回答
网友
1楼 · 发布于 2024-04-26 14:44:15

一个可能的答案由Martijn Pieters给出:

The advantages are that with native support, you can also introduce additional syntax to support asynchronous context managers and iterators. Entering and exiting a context manager, or looping over an iterator then can become more points in your co-routine that signal that other code can run instead because something is waiting again

事实上,这已经通过新的async withasync for语法来实现,而这些语法并不像装饰生成器那样容易用“附加”解决方案来实现。在

相关问题 更多 >