Python asyncio';事件循环的使用?

Python asyncio';事件循环的使用?,python,python-asyncio,scheduling,Python,Python Asyncio,Scheduling,我看了所有的文档,但找不到 假设完成了多个wait调用,并且它们的协程都准备好恢复,那么asyncio的事件循环使用什么算法来决定恢复哪个协程?1)向我们展示了事件循环以永远运行运行_直到完成为止。我们需要找到函数的源代码,看看接下来会发生什么 2)最快的方法(我知道)是在github上搜索相关名称。转到,使用左上角的搜索表单: Github将显示项目中的所有事件。确保在代码中搜索: 3)我们需要实现,发现了两个:由于部分重新实现了父事件循环,所以没有发生任何有趣的事情;这似乎就是我们要寻找

我看了所有的文档,但找不到

假设完成了多个
wait
调用,并且它们的协程都准备好恢复,那么
asyncio
的事件循环使用什么算法来决定恢复哪个协程?

1)向我们展示了事件循环以
永远运行
运行_直到完成为止。我们需要找到函数的源代码,看看接下来会发生什么

2)最快的方法(我知道)是在github上搜索相关名称。转到,使用左上角的搜索表单:

Github将显示项目中的所有事件。确保在代码中搜索:

3)我们需要实现,发现了两个:由于部分重新实现了父事件循环,所以没有发生任何有趣的事情;这似乎就是我们要寻找的

4)让我们检查一下代码。很快,我们就会看到在
内部调用
\u run\u一次
,而在True中调用
循环:

try:
    events._set_running_loop(self)
    while True:
        self._run_once()
        if self._stopping:
            break
5)让我们
运行一次
(我们可以在页面上搜索
def\u运行一次
)。这里是恢复预定的事情的地方。在阅读源代码时,您将看到两个有趣的地方:

  • 使用
    event\u list=self.\u selector.select(timeout)
    -异步IO在此休眠,直到套接字上的活动。你可以通过阅读进一步研究这一机制。但这个地方本身并没有恢复合作
  • 我们读到:
    这是唯一一个实际*调用*回调的地方。所有其他位置只需将它们添加到就绪状态。
这正是我们要找的。您可以在那里阅读源代码(通常在
中运行一次
函数),查看回调是如何执行的,以及它们是如何添加到
self.\u ready
以执行的。回调包括添加的回调和asyncio内部用于恢复协同路由的回调

您还可以重新实现事件循环来使用它。看一看,它包含事件循环重新实现的示例


几点注意:

  • 除非文档中另有规定,具体算法是实现的细节,可以在异步IO版本之间更改。你不应该依赖它
  • 不同的事件循环可以实现不同的算法。虽然所有asyncio的循环似乎都在
    BaseEventLoop
    中使用一个,但其他事件循环(如custom)可能会做一些不同的事情
  • 通常是为了找到我在PyCharm中使用的东西的源代码。它比在github上搜索快得多,也更方便,但由于某些原因,它不能与asyncio一起工作