Каково поведение Мио в опросе с нулевым тайм-аутом?
Согласно mio::Poll
документы:
Функция блокируется до тех пор, пока не будет получено хотя бы одно событие готовности или истечет время ожидания. Тайм-аут None означает, что опрос будет заблокирован, пока не будет получено событие готовности.... Обратите внимание, что время ожидания будет округлено до степени детализации системных часов (обычно 1 мс), а задержки планирования ядра означают, что интервал блокировки может быть превышен на небольшую величину.
Между тем, Linux select()
имеет функцию нулевого тайм-аута:
Если оба поля временной структуры равны нулю, тогда select() возвращается немедленно. (Это полезно для опроса.)
Каково поведение Мио на Duration::from_secs(0)
будет ли это работать как Linux select()
?
1 ответ
Я полагаю, вы хотите получить ответ по Linux, потому что вы ссылаетесь на руководство по Linux.
mio
использования epoll()
не select()
в Linux:
/// | OS | Selector |
/// |------------|-----------|
/// | Linux | [epoll] |
/// | OS X, iOS | [kqueue] |
/// | Windows | [IOCP] |
/// | FreeBSD | [kqueue] |
/// | Android | [epoll] |
И соответствующая цитата из epoll()
является:
Аргумент timeout указывает минимальное количество миллисекунд, которые epoll_wait() будет блокировать. (Этот интервал будет округлен до степени детализации системных часов, а задержки в планировании ядра означают, что интервал блокировки может быть переполнен на небольшую величину.) Задание времени ожидания -1 приводит к тому, что epoll_wait() блокируется бесконечно, при этом указывается время ожидания, равное ноль вызывает немедленное возвращение epoll_wait(), даже если нет доступных событий.
Так, Duration::from_secs(0)
не будет ждать входящего события. Вы можете проверить код mio
Вот
let timeout_ms = timeout
.map(|to| cmp::min(millis(to), i32::MAX as u64) as i32)
.unwrap_or(-1);
Мы можем видеть, что поведение mio
будет копировать поведение epoll()
,