新的python异步和等待关键字

新的python异步和等待关键字,python,asynchronous,syntax,async-await,Python,Asynchronous,Syntax,Async Await,有人能解释一下中概述的新语法吗?这两者之间的主要区别是什么 def do_nothing(): return 及 简而言之,因为这是一个广泛的话题: @asyncio.coroutine def foo(): bar = yield from some_async_func() print(bar) asyncio.get_event_loop().run_until_complete(foo()) 这定义了一个使用asyncio模块的协同路由foo是一个协程,它调

有人能解释一下中概述的新语法吗?这两者之间的主要区别是什么

def do_nothing():
    return


简而言之,因为这是一个广泛的话题:

@asyncio.coroutine
def foo():
    bar = yield from some_async_func()
    print(bar)

asyncio.get_event_loop().run_until_complete(foo())
这定义了一个使用asyncio模块的协同路由
foo
是一个协程,它调用一个协程
some\u async\u func
(因为它调用一个异步函数,所以它本身也必须是异步的)。整个装置需要在事件循环中异步运行

调用
foo()
将生成一个生成器对象,事件循环将运行该对象,直到不再生成任何内容为止
yield from
挂起函数并将其交给另一个协同程序,其执行方式基本相同(生成器、直到完成等)。完成该生成器后,返回该值并将其分配给
,该函数将解冻

简而言之,这就是异步编程

PEP 0492希望通过一些具体方式改进对此类编程的支持:

  • 建议在Python中使协同路由成为一个适当的独立概念[…]
  • 很容易将协程与常规生成器混淆,因为它们共享相同的语法[…]
  • 函数是否为协程取决于函数体中语句的屈服或屈服,这可能导致不明显的错误[…]
  • 对异步调用的支持仅限于在语法上允许产生的表达式,从而限制了语法特性的有用性[…]
这些观点表明,协同程序是一个相当独特的东西,但与语言中的其他东西没有太大区别,因为它们大多劫持了已经存在的生成器语法。PEP希望通过使协程和异步编程成为自己独立的、更易于使用的东西来改进这一点

  • 该建议引入了新的语法和语义,以增强Python中的协同程序支持
  • 以下新语法用于声明本机协同程序[…]
仅仅将协同程序升级为本机类型应该是一个明显的改进。它允许您像任何其他类型一样检测协同路由。它还统一了执行。目前有一个用于协同路由的“本机”
asyncio
模块,但也有像Twisted这样的第三方库,它们有自己的语法和协同路由的装饰器

  • 此PEP假设异步任务由事件循环[…]调度和协调,而PEP不与任何特定的事件循环实现[…]
这意味着您将能够使用一种已定义的语法编写协同路由,同时使用您想要的任何兼容的事件循环实现来执行它们


其余的建议可以在政治公众人物中阅读。

我认为政治公众人物的摘要和基本原理是可以理解的。你不明白他们怎么了?您一般了解协同程序/异步编程吗,或者我们需要从这里开始吗?您使用过Python 3.4
asyncio
模块吗?通过查看现有的3.4代码和相应的3.5代码,更容易理解
async
/
wait
。(在PEP中引用了一些关于python思想和python开发线程的消息,其中包括指向此类比较的链接;我希望其中一个能够进入PEP本身,但是……)也许这会有所帮助。我从未使用过异步编程本身,尽管我对它有一些概念。也许这只是纯python中这个语法所取代的一个最小的工作示例,这正是我所希望的。这两个函数之间唯一的区别(因为它们没有
yield
yield from
wait
,或者非bare
return
语句)是第一个是协同程序。因此,当你调用它时,你得到的不是
None
,而是一个corroutine对象,当
wait
ed时,它会给你
None
。如果你不首先了解协同程序的基本概念以及它们在异步I/O中的使用方式,那么这对你来说就毫无意义。你需要先阅读
asyncio
教程,或者等到有人为3.5编写新教程。如果你至少有一点C#甚至JavaScript的背景,您可以查看这些语言的
async
/
wait
功能,以查看一些示例。
@asyncio.coroutine
def foo():
    bar = yield from some_async_func()
    print(bar)

asyncio.get_event_loop().run_until_complete(foo())