#async-io #reactor #file-io #sockets #future #async

反应堆

性能优先的跨平台异步 IO 实现

4 个版本

0.1.4 2023 年 3 月 15 日
0.1.3 2023 年 3 月 14 日
0.1.2 2023 年 3 月 11 日
0.1.0 2023 年 3 月 4 日

#665异步

26 每月下载量

MIT 许可证

115KB
3K SLoC

反应堆

"Crates.io version" "docs.rs docs" "ci" "publish" License: MIT

反应堆 是一个用于 Rust 的底层跨平台异步 IO 包装库 futures

  • linux/android epoll 后端
  • macos/ios/freebsd kqueue 后端
  • windows iocp 后端

基准测试

isolated

线程模型

反应堆 不限制它使用的线程模型。特别是,我们可以创建多个 IoReactor 对象来共享 IO 负载

use reactors::io::*;
use reactors::io::socket::tcp::TcpAcceptor;
use reactors::io::IoReactor;
use std::thread::spawn;
use futures::TryStreamExt;
use futures::{AsyncReadExt, AsyncWriteExt};
use futures::executor::block_on;
use std::time::Duration;
use reactors::Reactor;

fn main() -> anyhow::Result<()> {
    let acceptor_reactor = IoReactor::default();
    let connection_reactor = IoReactor::default();

    let mut acceptor_reactor_background = acceptor_reactor.clone();
    let mut connection_reactor_background = connection_reactor.clone();

    spawn(move || {
        acceptor_reactor_background.poll_once(Duration::from_millis(100)).unwrap();
    });

    spawn(move || {
        connection_reactor_background.poll_once(Duration::from_millis(100)).unwrap();
    });

    let mut acceptor = TcpAcceptor::new(acceptor_reactor, "127.0.0.1:1813".parse()?, Some(connection_reactor))?;

    block_on(async {
        while let Some((conn, _)) = acceptor.try_next().await.unwrap() {
            let mut reader = conn.to_read_stream(None);
            let mut writer = conn.to_write_stream(None);

            let mut buff = [0u8; 11];

            reader.read_exact(&mut buff).await.unwrap();

            assert_eq!(&buff, b"hello world");

            writer.write_all(&buff).await.unwrap();
        }
    });

    Ok(())
}

依赖项

~0.8–8.5MB
~61K SLoC