有人可以解释PEP 0492: Coroutines with async and await syntax中列出的新语法吗?
之类的主要区别是什么?def do_nothing():
return
和
async def do_nothing():
return
答案 0 :(得分:8)
简而言之,因为这是一个广泛的主题:
@asyncio.coroutine
def foo():
bar = yield from some_async_func()
print(bar)
asyncio.get_event_loop().run_until_complete(foo())
这使用asyncio模块定义了一个协同程序。 foo
是一个协程,它调用一个协程some_async_func
(因为它调用异步函数,它本身也必须是异步的)。整个装置需要异步运行在事件循环中。
对foo()
的调用产生一个生成器对象,事件循环运行直到它不再生成任何东西。 yield from
暂停函数并将其交给另一个协程,它基本上以相同的方式执行(生成器,直到完成等等)。完成该生成器后,将返回该值并将其分配给bar
,并且该函数将解冻。
简而言之,这就是异步编程。
PEP 0492希望以某些特定方式改进对此类编程的支持:
- 建议在Python [..]
中使协同程序成为一个适当的独立概念- 很容易将协同程序与常规生成器混淆,因为它们共享相同的语法[..]
- 函数是否是协程,取决于其正文中的语句的收益率或收益率,这可能导致不明显的错误[...]
- 对异步调用的支持仅限于语法允许yield的表达式,限制语法特性的有用性[..]
这些观点说协同程序是一个相当独特的东西,但与语言中的其他东西并不是很明显,因为它们主要劫持已经存在的生成器语法。 PEP希望通过使协同程序和异步编程成为易于使用的独立程序来改进这一点。
- 此提案引入了新的语法和语义,以增强Python中的协程支持。
- 以下新语法用于声明本机协程[..]
将协程提升为本机类型应该是一个明显的改进。它允许您像任何其他类型一样键入检测协同程序。它还统一了实施。目前有一个用于协同程序的“本地”asyncio
模块,但也有像Twisted这样的第三方库,它们有自己的语法和协同程序装饰器。
- 此PEP假定异步任务由事件循环[...]调度和协调,而PEP不依赖于任何特定的事件循环实现[..]
这就是说你可以使用一个定义的语法编写协同程序,然后使用你想要的任何兼容的事件循环实现来执行它们。
您可以在PEP中阅读其他提案。