tokio 任务调度程序是“窃取工作”还是先从全局队列中获取?

pan*_*cat 5 rust rust-tokio

tokio中,当处理器完成运行队列中的所有任务时,它们是首先在全局队列中查找更多任务,还是首先尝试从同级处理器中窃取工作?

Mas*_*inn 7

鉴于这是没有记录的,我认为它是未指定的,并且不是图书馆保证的一部分,除非您可以通过问题或 PR 接受来指定此行为。我强烈建议不要依赖当前的行为。

话虽这么说,“使用卢克代码”是一个很短的路程:主运行循环将是Context::run。当本地队列为空时,它会调用Core::steal_work,它首先开始从同级队列窃取工作,然后回退到全局队列。

请注意,在正常操作期间,调度程序会偶尔尝试从全局队列中弹出任务,介绍工作窃取调度程序的文章指出:

在执行本地队列中的约 60 个任务后,处理器将尝试从全局队列中弹出。

  • @LouisLee 全局队列主要用于溢出或从非调度程序线程调度的任务,因此在正常操作中它可能是空的,特别是因为检查全局队列是正常操作的一部分。如果每个调度程序在没有本地工作时都使用全局队列,那么也会在该队列上产生大量争用。 (2认同)