#rust #rust-tokio
#Ржавчина #rust-tokio
Вопрос:
Я искал исходный код tokio, чтобы получить ответ на вопрос, и у меня создалось впечатление, что метод sleep буквально устанавливает таймер с продолжительностью, но я думаю, что, возможно, я неправильно понял код, потому что это было бы крайне неэффективно. Можно ли получить более четкое представление об этом?
Ответ №1:
Когда вы ожидаете sleep
метод, происходят две вещи:
- Новый таймер вставляется в колесо таймера, которое является частью среды выполнения Tokio.
- Задача передается исполнителю. Это удаляет задачу из очереди выполнения.
Среда выполнения Tokio между запущенными на ней задачами опроса проверяет как epoll на наличие событий ввода-вывода, так и колесо таймера на наличие событий таймера. Всякий раз, когда происходит такое событие, среда выполнения Tokio запускает пробуждение для связанной задачи, возвращая эту задачу в очередь выполнения.
Когда никакие задачи не готовы к запуску, Tokio перейдет в спящий режим, заблокировав событие epoll. Время ожидания этого режима ожидания равно наименьшему таймеру в колесе таймера, что позволяет Tokio разбудить эту задачу по истечении таймера.
Колесо таймера — это структура данных, которая позволяет вам эффективно обращаться к наименьшему таймеру, аналогично, например, двоичной куче, но позволяет удалять таймеры, если они отменены.