tokio::time::sleep 方法是否将任务从运行队列中取出?

pan*_*cat 5 rust rust-tokio

我一直在寻找 tokio 源代码来获取问题的答案,我的印象是sleep 方法实际上放置了一个带有持续时间的计时器,但我认为我可能误解了代码,因为这样做效率非常低。是否可以更清楚地了解这一点?

Ali*_*yhl 8

当您等待该sleep方法时,会发生两件事:

  1. 新计时器被插入到计时器轮中,该计时器轮是 Tokio 运行时的一部分。
  2. 任务交给执行者。这会将任务从运行队列中删除。

Tokio 运行时将在其上运行的轮询任务之间检查 IO 事件的 epoll 和计时器事件的计时器轮。每当发生此类事件时,Tokio 运行时都会向关联任务发出唤醒信号,将该任务放回到运行队列中。

当没有任务准备运行时,Tokio 将通过阻塞 epoll 事件进入睡眠状态。此睡眠的超时时间等于计时器轮中最小的计时器,允许 Tokio 在计时器到期时唤醒该任务。

计时器轮是一种数据结构,可让您有效地访问最小的计时器,类似于二进制堆,但如果计时器被取消,它允许删除计时器。