Mio 在持续时间为零超时的投票中的行为是什么?



根据mio::Poll文档:

该函数将阻塞,直到收到至少一个就绪事件或超时已过。超时为 None 表示轮询将阻止,直到收到就绪事件。 ... 请注意,超时将四舍五入到系统时钟粒度(通常为 1 毫秒(,内核调度延迟意味着阻塞间隔可能会超出少量。

同时,Linux的select()具有零超时功能:

如果 timeval 结构的两个字段都为零,则 select(( 立即返回。 (这对于轮询很有用。

Mio在Duration::from_secs(0)上的行为是什么,它会像Linux的select()一样工作吗?

我想你想要一个Linux的答案,因为你链接到Linux手册。

mio在Linux上使用epoll(),而不是select()

/// |      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()的行为。

相关内容

  • 没有找到相关文章

最新更新