Python 3 asyncio 是否使用像 Rust Tokio 这样的工作窃取调度程序?默认调度程序的行为是什么?有记录在某处吗?
“Work-stealing”是多线程执行器的一种实现策略。在此策略中,每个执行器线程将生成的任务添加到线程本地队列中,并从该队列执行任务。仅当本地队列为空时,执行程序才会从另一个线程的队列中“窃取”任务。这为平衡工作负载提供了出色的线程局部性,同时动态适应不平衡工作负载。
Python asyncio 的执行器(事件循环)是单线程的,因此根据定义它不是工作窃取。异步事件循环与线程的行为记录在文档的并发和多线程部分中(以及其他地方)。
至于用于调度的算法,有意未指定,但stdlib实现使用:
call_soon()
或 create_task()
调度的回调)以及与准备读/写的文件描述符关联的回调,以及 loop.call_after()
和 loop.call_at()
安排的回调,还包括由 asyncio.sleep()
暂停的协程的延续,其内部使用 loop.call_at()
。在每次循环迭代中,循环等待与协程关联的文件描述符发生某些事情,并设置超时以在最近的基于时间的回调中中断睡眠,以防在此之前没有发生任何有趣的事情。它继续调用就绪回调和计划在当前或更早时间运行的超时。重复此操作,直到指示事件循环停止。