tokio::time::sleep 方法是否从 运行 队列中取出任务?
Does tokio::time::sleep method take task off the run queue?
我一直在寻找 tokio 源代码以获得问题的答案,我的印象是 the sleep method literally puts a timer with duration 但我认为我可能误解了代码,因为这样做效率非常低。是否可以更清楚地了解这一点?
当您等待 sleep
方法时,会发生两件事:
- 新计时器被插入到作为 Tokio 运行time 的一部分的计时器轮中。
- 任务让步给执行者。这会将任务从 运行 队列中移除。
Tokio 运行time 将在其上的轮询任务 运行ning 之间检查 epoll 的 IO 事件和定时器轮的定时器事件。每当发生此类事件时,Tokio 运行time 都会唤醒相关任务,将该任务放回 运行 队列。
当没有任务准备好 运行 时,Tokio 将通过阻止 epoll 事件进入睡眠状态。此睡眠的超时等于计时器轮中的最小计时器,允许 Tokio 在计时器结束时唤醒该任务。
计时器轮是一种数据结构,可让您有效地访问最小的计时器,类似于例如一个二叉堆,但它允许删除计时器,如果它们被取消的话。
我一直在寻找 tokio 源代码以获得问题的答案,我的印象是 the sleep method literally puts a timer with duration 但我认为我可能误解了代码,因为这样做效率非常低。是否可以更清楚地了解这一点?
当您等待 sleep
方法时,会发生两件事:
- 新计时器被插入到作为 Tokio 运行time 的一部分的计时器轮中。
- 任务让步给执行者。这会将任务从 运行 队列中移除。
Tokio 运行time 将在其上的轮询任务 运行ning 之间检查 epoll 的 IO 事件和定时器轮的定时器事件。每当发生此类事件时,Tokio 运行time 都会唤醒相关任务,将该任务放回 运行 队列。
当没有任务准备好 运行 时,Tokio 将通过阻止 epoll 事件进入睡眠状态。此睡眠的超时等于计时器轮中的最小计时器,允许 Tokio 在计时器结束时唤醒该任务。
计时器轮是一种数据结构,可让您有效地访问最小的计时器,类似于例如一个二叉堆,但它允许删除计时器,如果它们被取消的话。