24 个不稳定版本 (9 个重大变更)
使用旧的 Rust 2015
0.10.0 | 2018 年 3 月 5 日 |
---|---|
0.8.2 | 2018 年 1 月 15 日 |
0.8.1 | 2017 年 7 月 16 日 |
0.6.0 | 2016 年 10 月 1 日 |
0.3.2 | 2016 年 7 月 26 日 |
#7 in #kqueue
在 2 crates 中使用
75KB
1.5K SLoC
用法
将以下内容添加到您的 Cargo.toml
[dependencies]
amy = "0.5"
将其添加到您的 crate 根目录
extern crate amy;
简介
Amy 是一个 Rust 库,通过抽象内核轮询器(如 kqueue 和 epoll)来支持异步 I/O。Amy 设计背后的目标如下:
-
干净的 I/O 抽象 - 不要求用户了解内核轮询器的内部结构,如触发模式、过滤器、文件描述符等...
-
最小配置 - 与干净的抽象一致,在库内部进行轮询模式的选择,以便在不让用户理解底层细节的情况下提供库所需的语义
-
性能 - Amy 在启动后不进行任何运行时分配,并通过尽可能的非阻塞算法限制系统调用
-
最小实现 - Amy 实现了仅够完成任务所需的代码。没有过多的类型或特性。代码也应该能够线性阅读,而无需在文件间跳转。这应该使得对正确性和性能的审计更加容易。
-
小型且一致的 API - 只需要理解几个概念,使用几个函数。
-
Rust 标准类型和特性的重用 - 而不是围绕每个可轮询的 I/O 类型(如 TcpStreams)创建包装器,库可以直接使用标准库类型。唯一的要求是这些类型实现
AsRawFd
特性,并且可以通过内核机制进行轮询。
使用 Amy 开始编写代码的最佳方式是查看 [入门指南] (https://github.com/andrewjstone/amy/blob/master/doc/getting_started.md)。
这与 Mio 有何不同?
Mio 是一个令人惊叹的项目,Amy从中借鉴了许多想法。然而,这两个项目在一些特定领域有所不同。核心区别在于 mio 本质上是单线程的:注册必须在与 poller 相同的线程上进行,并且必须唤醒 poll 循环才能添加注册。相比之下,Amy 允许在与其他线程的 poller 无需唤醒的情况下进行注册。Amy 还提供了一套较小的代码库,专注于异步网络编程。它不允许任意将事件注册到内核 poller,尽管这可以很容易地提供。像 Mio 一样,Amy 是一个构建块,选择使用哪一个只是个人偏好的问题。
使用 Mio 或 Amy 的选择并不一定明确,因此以下列出了一些特性,以及一些(主观的)用例,说明选择 Mio 或 Amy 的原因。
如果您选择 Mio,则
- 需要 Windows 支持
- 正在编写单线程服务器
- 想要使用标准的 Rust 异步 I/O 库
如果您选择 Amy,则
- 仅需要
\*nix
支持 - 正在编写需要跨线程注册的多线程服务器
- 想要一个小型、易于审计的库,且不包含太多 unsafe 代码
- 愿意使用新事物且不太成熟的东西
局限性
- 仅适用于实现 epoll 和 kqueue 的系统(Linux、BSDs、Mac OSX 等...)
- 在 Windows 上不可用,尽管我相信可以在 IOCP 上实现 Poller 和 Registrar 类型
依赖项
~2MB
~41K SLoC