首页 > 解决方案 > 协程和生成器之间的差异,Asyncio

问题描述

我正在尝试更多地了解协程以及asyncio.

据我所知,协程是一个生成器函数。您可以使用async def. 你可以对生成器函数做的所有事情,你都可以对协程做。你可以做coroutine.send(None), coroutine.throw(Exception), coroutine.close(). 现在我有两个关于协程的问题:

  1. 当您添加yield到函数时,它会成为生成器函数。这意味着您必须在每个生成器中至少包含一次 yield。对于大多数协程(例如在 discord.py 中),我根本看不到 yield 关键字!那么它们是如何生成的呢?也许await关键字会产生或什么?请解释。

  2. 如果生成器和协程相同,为什么它们有不同的名称?

现在我想我对生成器函数有了一些了解,它们产生了,你可以向它们发送东西甚至异常。我认为协程是一样的。

所以,我知道这一点:事件循环在看到await关键字时停止协程(这个关键字只是调用.__await__()方法)。然后它只执行该关键字之后的函数,然后继续执行不同的任务。很简单。

但我不明白这如何将控制权交还给事件循环。

也许事件循环在运行任务时会这样做:coroutine.send(None)所以它等到屈服于上下文切换?所以也许等待是一种收益?但是如果它确实产生了,那将使它成为一个生成器方法,并且实际的协程没有产生,但是__await__()是?

很混乱的东西。有人可以解释什么await和该方法的.__await__()作用吗?

所以总结一下我的问题:

  1. 生成器函数和协程有什么区别?
  2. 这两者之间有什么不同的用例?
  3. 它们的工作方式有何不同?
  4. asyncio 如何在等待之前运行协同程序?
  5. 方法有什么作用__await__()
  6. 为什么我在协程中看不到任何收益?

标签: pythongeneratorpython-asyncio

解决方案


推荐阅读