Python3 asyncio是否使用与Rust Tokio类似的工作窃取调度器?
关于asyncio是否使用类Tokio的工作窃取调度器
默认的Python标准库asyncio实现不采用和Rust Tokio类似的工作窃取调度器。核心原因是标准库asyncio的默认事件循环是单线程运行模型,不存在多个工作线程构成的worker池,自然没有跨worker偷取任务的必要和逻辑。而Tokio的工作窃取调度是面向多线程worker池设计的,用于均衡多个CPU核心的任务负载,二者基础架构完全不同。仅有部分第三方开发的多线程asyncio兼容运行时可能实现了工作窃取逻辑,不属于标准库默认实现的范围。
asyncio默认调度器的具体运行行为
asyncio的调度单元为Task对象,默认调度逻辑符合以下规则:
- 所有协程Task都在事件循环所在的单线程内串行执行,同一时间仅有一个Task处于运行状态,不存在多线程并行执行协程的情况
- 就绪Task队列采用FIFO(先进先出)调度逻辑,没有内置的优先级区分,所有Task的调度优先级一致
- 调度为非抢占式:正在运行的Task不会被事件循环强制打断,只有当Task主动通过
await关键字挂起自身时,才会将控制权交还给事件循环,事件循环再从就绪队列头部取出下一个Task执行 - 调用
run_in_executor提交到线程/进程池执行的阻塞任务,由对应的线程/进程池负责调度,不属于asyncio协程调度器的管辖范围
官方调度规则相关文档
asyncio的调度逻辑有官方公开说明,可以在Python官方标准库文档的asyncio板块查询事件循环、Task对象的相关定义,也可以直接查阅CPython官方开源仓库中asyncio模块下tasks.py、events.py的源码及注释,所有调度逻辑的实现都是公开可查的。
内容的提问来源于stack exchange,提问作者user855
相关产品推荐
相关产品推荐

