#mio #io #worker-pool #networking

弃用 bin+lib mio-pool

一组连接的协作工作池

16个版本

使用旧Rust 2015

0.5.7 2018年12月4日
0.5.6 2018年4月13日
0.5.4 2018年2月20日
0.5.1 2018年1月17日
0.1.1 2018年1月15日

#82 in #mio

Download history 59/week @ 2024-03-31 11/week @ 2024-06-30 48/week @ 2024-07-14

每月59次下载

MIT/Apache

39KB
484

mio-pool

Crates.io Documentation Build Status

一组连接的协作工作池。

此crate是为服务器监听连接并且希望将处理已接受连接的负载分散到多个线程的场景而编写的。具体来说,此crate实现了一个共享单个 mio::Poll 实例的工作池,并共同接受新连接和处理现有连接的事件。

用户应该从 PoolBuilder 结构体开始,它允许从任何可以作为 Listener 的东西创建一个新的池(基本上,任何可以被轮询并接受新连接的东西,这些连接本身也可以被轮询;例如,mio::net::TcpListener)。

示例

use std::io::prelude::*;

let addr = "127.0.0.1:0".parse().unwrap();
let server = mio::net::TcpListener::bind(&addr).unwrap();
let addr = server.local_addr().unwrap();
let pool = PoolBuilder::from(server).unwrap();
let h = pool.with_state(Vec::new()).and_return(|v| v)
    .run(1 /* # workers */, |c: &mut mio::net::TcpStream, s: &mut Vec<u8>| {
        // new data is available on the connection `c`!
        let mut buf = [0u8; 1024];

        // let's just echo back what we read
        let n = c.read(&mut buf)?;
        if n == 0 {
            return Ok(true);
        }
        c.write_all(&buf[..n])?;

        // keep some internal state
        s.extend(&buf[..n]);

        // assume there could be more data
        Ok(false)
    });

// new clients can now connect on `addr`
use std::net::TcpStream;
let mut c = TcpStream::connect(&addr).unwrap();
c.write_all(b"hello world").unwrap();
let mut buf = [0u8; 1024];
let n = c.read(&mut buf).unwrap();
assert_eq!(&buf[..n], b"hello world");

// we can terminate the pool at any time
let results = h.terminate();
// results here contains the final state of each worker in the pool.
// that is, the final value in each `s` passed to the closure in `run`.
let result = results.into_iter().next().unwrap();
assert_eq!(&result.unwrap(), b"hello world");

依赖项

~2.5MB
~48K SLoC