使用Tokio启动多个线程

时间:2018-10-29 05:50:30

标签: rust rust-tokio

我正在尝试创建基本的tcp服务器:

  1. 服务器应该能够向所有连接的客户端广播消息流
  2. 服务器应该能够从所有客户端接收命令并对其进行处理

这是我在main函数中所拥有的:

let (server_tx, server_rx) = mpsc::unbounded();
let state = Arc::new(Mutex::new(Shared::new(server_tx)));

let addr = "127.0.0.1:6142".parse().unwrap();

let listener = TcpListener::bind(&addr).unwrap();

let server = listener.incoming().for_each(move |socket| {
    // Spawn a task to process the connection
    process(socket, state.clone());
    Ok(())
}).map_err(|err| {
    println!("accept error = {:?}", err);
});

println!("server running on localhost:6142");

let _messages = server_rx.for_each(|_| {
    // process messages here
    Ok(())
}).map_err(|err| {
    println!("message error = {:?}", err);
});

tokio::run(server);  

playground

我以tokio存储库中的chat.rs示例为基础。
我正在根据传入的TCP消息将数据发送到server_tx
我遇到的麻烦是要消耗它们。
我正在使用server_rx.for_each(|_| {“消耗”传入的消息流,现在,如何告诉tokio运行它?

tokio::run接受一个未来,但我有2个(可能还有更多)。如何合并它们以使其并行运行?

1 个答案:

答案 0 :(得分:2)

将期货结合在一起:

let messages = server_rx.for_each(|_| {
    println!("Message broadcasted");
    Ok(())
}).map_err(|err| {
    println!("accept error = {:?}", err);
});

tokio::run(server.join(messages).map(|_| ()));

map()组合器是必需的,因为Join Item的关联类型是元组((), ()),并且 tokio::run()使用了将来的任务,该任务需要类型为Future::Item的{​​{1}}