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