PEP 0492 - Python 3.5 async 关键字
PEP 0492 - Python 3.5 async keyword 是为了解决使用生成器编写协程时的一些困惑而提出的。在Python 3.4以前,可以使用生成器来编写协程,通过在函数体中使用yield或yield from表达式创建一个生成器对象,只有在迭代生成器时才执行代码。结合其他事件循环库(如asyncio),可以编写协程,向事件循环发出信号,告知它们即将进行繁忙的操作(例如等待I / O),在此期间可以运行另一个协程。
然而,由于生成器可以用于各种任务,不仅仅是协程,而且使用生成器语法编写协程可能会让新手感到困惑。因此,PEP 0492 引入了新的语法,使得编写协程更加清晰明了。通过引入async关键字,可以声明一个协程函数。
使用async关键字重写上述示例代码如下:
async def display_date(loop): end_time = loop.time() + 5.0 while True: print(datetime.datetime.now()) if (loop.time() + 1.0) >= end_time: break await asyncio.sleep(1)
新的协程对象仍然需要一个事件循环来驱动协程。事件循环会依次等待每个协程,执行那些目前没有等待任何操作的协程。
使用原生支持的优势是,还可以引入其他语法来支持异步上下文管理器和迭代器。进入和退出上下文管理器,或者循环遍历迭代器,都可以成为协程中的可中断点,表示其他代码可以运行,因为某些操作正在等待。
总结一下,PEP 0492 的出现是为了解决使用生成器编写协程的困惑,并引入了新的语法async来声明协程函数,使得编写和理解协程更加清晰明了。这样的改进带来了许多优势,例如支持异步上下文管理器和迭代器,使得协程的使用更加方便和灵活。