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

问题描述 投票:0回答:1

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

python python-3.x python-asyncio
1个回答
7
投票

“Work-stealing”是多线程执行器的一种实现策略。在此策略中,每个执行器线程将生成的任务添加到线程本地队列中,并从该队列执行任务。仅当本地队列为空时,执行程序才会从另一个线程的队列中“窃取”任务。这为平衡工作负载提供了出色的线程局部性,同时动态适应不平衡工作负载。

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.