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