4 个版本

使用旧 Rust 2015

0.1.3 2016年6月23日
0.1.2 2016年5月30日
0.1.1 2016年5月11日
0.1.0 2016年4月24日

异步 中排名 1361

每月下载 27
用于 capnp-gj

MIT 许可证

60KB
1K SLoC

干得好,伙计

基于 gj 事件循环 的异步输入和输出。

Build Status Build status

文档

在 Linux 上使用 epoll,在 OSX 上使用 kqueue,在 Windows 上使用 I/O 完成端口。


lib.rs:

异步输入和输出。

示例

extern crate gj;
extern crate gjio;
use gj::{EventLoop, Promise};
use gjio::{AsyncRead, AsyncWrite, BufferPrefix, SocketStream};

fn echo(mut stream: SocketStream, buf: Vec<u8>) -> Promise<(), ::std::io::Error> {
    stream.try_read(buf, 1).then(move |(buf, n)| {
        if n == 0 { // EOF
            Promise::ok(())
        } else {
            stream.write(BufferPrefix::new(buf, n)).then(move |prefix| {
                echo(stream, prefix.buf)
            })
        }
    })
}

fn main() {
    EventLoop::top_level(|wait_scope| -> Result<(), ::std::io::Error> {
        let mut event_port = try!(gjio::EventPort::new());
        let network = event_port.get_network();
        let mut listen_address = network.get_tcp_address(
            ::std::str::FromStr::from_str("127.0.0.1:0").unwrap());
        let listener = try!(listen_address.listen());
        let connect_address = network.get_tcp_address(try!(listener.local_addr()));

        let promise1 = listener.accept().then(move |stream| {
            echo(stream, vec![0;5]) // Tiny buffer just to be difficult
        });

        let promise2 = connect_address.connect().then(move |mut stream| {
            stream.write(b"hello world").then(move |_| {
                stream.read(vec![0; 11], 11).map(|(buf, _)| {
                    assert_eq!(buf, b"hello world");
                    Ok(())
                })
           })
        });

        let all = Promise::all(vec![promise1, promise2].into_iter());
        try!(all.wait(wait_scope, &mut event_port));
        Ok(())
    }).expect("top level");
}

依赖项

~2.5MB
~51K SLoC