#async-io #kqueue #epoll #file-descriptor #event-loop #timer #async

amy

在 kqueue 和 epoll 周围的多线程异步网络编程中的轮询和注册抽象

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 中使用

Apache-2.0

75KB
1.5K SLoC

Build Status

API 文档

用法

将以下内容添加到您的 Cargo.toml

[dependencies]
amy = "0.5"

将其添加到您的 crate 根目录

extern crate amy;

简介

Amy 是一个 Rust 库,通过抽象内核轮询器(如 kqueueepoll)来支持异步 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