Удаляет ли tokio ::time ::sleep метод задачу из очереди выполнения?

#rust #rust-tokio

#Ржавчина #rust-tokio

Вопрос:

Я искал исходный код tokio, чтобы получить ответ на вопрос, и у меня создалось впечатление, что метод sleep буквально устанавливает таймер с продолжительностью, но я думаю, что, возможно, я неправильно понял код, потому что это было бы крайне неэффективно. Можно ли получить более четкое представление об этом?

Ответ №1:

Когда вы ожидаете sleep метод, происходят две вещи:

  1. Новый таймер вставляется в колесо таймера, которое является частью среды выполнения Tokio.
  2. Задача передается исполнителю. Это удаляет задачу из очереди выполнения.

Среда выполнения Tokio между запущенными на ней задачами опроса проверяет как epoll на наличие событий ввода-вывода, так и колесо таймера на наличие событий таймера. Всякий раз, когда происходит такое событие, среда выполнения Tokio запускает пробуждение для связанной задачи, возвращая эту задачу в очередь выполнения.

Когда никакие задачи не готовы к запуску, Tokio перейдет в спящий режим, заблокировав событие epoll. Время ожидания этого режима ожидания равно наименьшему таймеру в колесе таймера, что позволяет Tokio разбудить эту задачу по истечении таймера.

Колесо таймера — это структура данных, которая позволяет вам эффективно обращаться к наименьшему таймеру, аналогично, например, двоичной куче, но позволяет удалять таймеры, если они отменены.