#kqueue #epoll #iocp #mio

polling

epoll、kqueue、事件端口和IOCP的可移植接口

42个版本 (稳定)

3.7.3 2024年8月10日
3.7.2 2024年6月15日
3.7.0 2024年4月22日
3.6.0 2024年3月24日
0.1.9 2020年9月6日

#11 in 异步

Download history 698011/week @ 2024-04-29 714245/week @ 2024-05-06 779716/week @ 2024-05-13 760920/week @ 2024-05-20 748809/week @ 2024-05-27 799387/week @ 2024-06-03 797600/week @ 2024-06-10 794966/week @ 2024-06-17 821757/week @ 2024-06-24 773203/week @ 2024-07-01 836083/week @ 2024-07-08 866649/week @ 2024-07-15 925136/week @ 2024-07-22 890173/week @ 2024-07-29 914878/week @ 2024-08-05 912826/week @ 2024-08-12

3,686,614 每月下载量
用于 4,976 个crate(32个直接使用)

Apache-2.0 OR MIT

200KB
4K SLoC

polling

Build License Cargo Documentation

epoll、kqueue、事件端口和IOCP的可移植接口。

支持的平台

  • epoll: Linux、Android、RedoxOS
  • kqueue: macOS、iOS、tvOS、watchOS、FreeBSD、NetBSD、OpenBSD、DragonFly BSD
  • 事件端口: illumos、Solaris
  • poll: VxWorks、Fuchsia、HermitOS、其他Unix系统
  • IOCP: Windows、Wine(版本7.13+)

轮询以单次模式进行,这意味着如果需要关注同一类型事件的下一个事件,则需要在事件传递后重置对I/O事件的兴趣。

同一时间只能有一个线程等待I/O事件。

示例

use polling::{Event, Poller};
use std::net::TcpListener;

// Create a TCP listener.
let socket = TcpListener::bind("127.0.0.1:8000")?;
socket.set_nonblocking(true)?;
let key = 7; // Arbitrary key identifying the socket.

// Create a poller and register interest in readability on the socket.
let poller = Poller::new()?;
poller.add(&socket, Event::readable(key))?;

// The event loop.
let mut events = Vec::new();
loop {
    // Wait for at least one I/O event.
    events.clear();
    poller.wait(&mut events, None)?;

    for ev in &events {
        if ev.key == key {
            // Perform a non-blocking accept operation.
            socket.accept()?;
            // Set interest in the next readability event.
            poller.modify(&socket, Event::readable(key))?;
        }
    }
}

许可证

许可协议为以下之一

任选其一。

贡献

除非您明确说明,否则您根据Apache-2.0许可证定义的任何有意提交的用于包含在作品中的贡献,均应如上双许可,而无需任何额外的条款或条件。

依赖关系

~2–12MB
~141K SLoC