10 个版本
0.3.0-alpha.10 | 2019年9月10日 |
---|---|
0.3.0-alpha.9 | 2019年6月25日 |
0.3.0-alpha.8 | 2019年5月12日 |
0.3.0-alpha.6 | 2019年4月26日 |
0.3.0-alpha.1 | 2018年11月28日 |
2166 在 异步
510 每月下载次数
用于 9 个 Crates(7 直接)
145KB
2K SLoC
Romio
Rust 中的异步网络原语。
Romio 结合了强大的 futures
抽象与 mio
的非阻塞 IO 原语,为 Rust 异步网络生态系统提供了高效且易用的异步 IO 原语。Romio 的原语是
- 快速:零成本的
Future
抽象提供了裸机性能,尽管 API 层次更高。 - 可靠:Romio 利用 Rust 的类型系统来减少错误并确保并发执行的异步函数之间的线程安全。
- 可扩展:Romio 具有最小的内存占用,并自然处理背压和取消。
Romio 基于 Tokio 包,将其组件移植到 futures 包的新版本。
示例
以下是两个使用 romio 的示例程序:一个提供莎士比亚随机引文的 TCP 服务器,以及一个连接到该服务器并打印收到的引文到标准输出的 TCP 客户端。
莎士比亚服务器
use std::io;
use futures::executor::{self, ThreadPool};
use futures::io::AsyncWriteExt;
use futures::task::SpawnExt;
use futures::StreamExt;
use rand::seq::SliceRandom;
use romio::{TcpListener, TcpStream};
const SHAKESPEARE: &[&[u8]] = &[
b"Now is the winter of our discontent\nMade glorious summer by this sun of York.\n",
b"Some are born great, some achieve greatness\nAnd some have greatness thrust upon them.\n",
b"Friends, Romans, countrymen - lend me your ears!\nI come not to praise Caesar, but to bury him.\n",
b"The evil that men do lives after them\nThe good is oft interred with their bones.\n",
b" It is a tale\nTold by an idiot, full of sound and fury\nSignifying nothing.\n",
b"Ay me! For aught that I could ever read,\nCould ever hear by tale or history,\nThe course of true love never did run smooth.\n",
b"I have full cause of weeping, but this heart\nShall break into a hundred thousand flaws,\nOr ere I'll weep.-O Fool, I shall go mad!\n",
b" Each your doing,\nSo singular in each particular,\nCrowns what you are doing in the present deed,\nThat all your acts are queens.\n",
];
fn main() -> io::Result<()> {
executor::block_on(async {
let mut threadpool = ThreadPool::new()?;
let mut listener = TcpListener::bind(&"127.0.0.1:7878".parse().unwrap())?;
let mut incoming = listener.incoming();
println!("Listening on 127.0.0.1:7878");
while let Some(stream) = incoming.next().await {
let stream = stream?;
let addr = stream.peer_addr()?;
threadpool
.spawn(async move {
println!("Accepting stream from: {}", addr);
recite_shakespeare(stream).await.unwrap();
println!("Closing stream from: {}", addr);
})
.unwrap();
}
Ok(())
})
}
async fn recite_shakespeare(mut stream: TcpStream) -> io::Result<()> {
//stream.set_keepalive(None);
let "e = SHAKESPEARE.choose(&mut rand::thread_rng()).unwrap();
stream.write_all(quote).await?;
Ok(())
}
莎士比亚客户端
use std::io;
use futures::executor;
use futures::io::{AllowStdIo, AsyncReadExt};
use romio::TcpStream;
fn main() -> io::Result<()> {
executor::block_on(async {
let mut stream = TcpStream::connect(&"127.0.0.1:7878".parse().unwrap()).await?;
let mut stdout = AllowStdIo::new(io::stdout());
stream.copy_into(&mut stdout).await?;
Ok(())
})
}
与 Tokio 的关系
Romio 是另一个名为 Tokio 的 Rust 项目的分支。Tokio 项目使用的是较旧的 futures API,这与新的 "async/await" 语法不兼容。为了让人们能够尝试 "async/await",Romio 将 tokio 项目的部分代码迁移到了与该语法兼容的新 futures API。
Romio 并非完全移植了 tokio:它仅包含整个 tokio 代码库的一小部分:编写异步网络代码所需的 IO 原语。它不暴露对核心 "reactor" 的低级控制 - 相反,所有异步 IO 原语都使用默认的 reactor 设置 - 并且它不包含与异步 IO 无直接关系的 tokio 的许多其他部分。
如果您想尝试使用新的 async/await 语法编写网络代码,则应使用 romio。然而,romio 与建立在 tokio 之上的其他库(如 hyper、actix 和 tower)并不直接兼容,因此如果您想使用这些库,romio 可能不适合您。
Romio 的目的是为尝试使用 async/await 的人提供便利,这就是为什么它暴露了如此简单的 API。它并非旨在成为 tokio 的完整 "竞争对手",我们预计 tokio 最终将迁移到新的 futures API 并与 async/await 语法兼容。
许可
本项目采用 MIT 许可证。
贡献
除非您明确声明,否则您提交给 romio 的任何贡献,都将根据 MIT 许可证授权,不附加任何额外条款或条件。
依赖项
~2.5MB
~47K SLoC