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一起工作