3

根据mio::Poll文档

该函数将阻塞,直到至少收到一个就绪事件或超时已过。None 的超时意味着 poll 将阻塞,直到收到准备就绪事件。...注意超时会向上取整到系统时钟粒度(通常为1ms),内核调度延迟意味着阻塞间隔可能会被少量溢出。

同时,Linux 的select()零超时特性

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

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

4

1 回答 1

1

我想您想要一个 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()

于 2018-04-11T23:57:37.727 回答