Каково поведение Мио в опросе с нулевым тайм-аутом?

Согласно 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(),

Другие вопросы по тегам