python3 asyncio 是否使用像 Rust Tokio 这样的工作窃取调度程序?

use*_*855 3 python python-3.x python-asyncio

Python 3 asyncio 是否使用像 Rust Tokio 这样的工作窃取调度程序?默认调度程序的行为是什么?它记录在某处吗?

use*_*342 6

“工作窃取”是多线程执行器的一个属性。Python asyncio 的执行器(事件循环)是单线程的,因此根据定义它不是工作窃取。异步事件循环与线程的行为记录在文档的并发和多线程部分(以及其他地方)。

至于用于调度的算法,有意未指定,但stdlib 实现使用:

  • 一个双端队列,用于存储准备运行的回调(使用call_soon()或调度的create_task()回调)以及与准备读/写的文件描述符关联的回调,以及
  • 一个二进制堆,用于存储安排在特定时间的回调,按它们应该触发的绝对时间排序。loop.call_after()这涵盖了由和安排的回调loop.call_at(),还包括由asyncio.sleep()内部使用的挂起的协程的延续loop.call_at()

在每次循环迭代中,循环都会等待与协程关联的文件描述符上发生某些事情,并设置超时以在最近的基于时间的回调中中断睡眠,以防在此之前没有发生任何有趣的事情。它继续调用就绪回调和计划在当前或更早时间运行的超时。重复此操作,直到指示事件循环停止。