如何在 Tokio 中安排重复任务?

loc*_*cka 10 future rust rust-tokio

我将用 Rust 编写的同步套接字代码替换为使用 Tokio 的异步等效代码。Tokio 使用 future 进行异步活动,因此任务会链接在一起并排队到执行器上,由线程池执行。

我想做的基本伪代码是这样的:

let tokio::net::listener = TcpListener::bind(&sock_addr).unwrap();
let server_task = listener.incoming().for_each(move |socket| {
    let in_buf = vec![0u8; 8192];
    // TODO this should happen continuously until an error happens
    let read_task = tokio::io::read(socket, in_buf).and_then(move |(socket, in_buf, bytes_read)| {
        /* ... Logic I want to happen repeatedly as bytes are read ... */
        Ok(())
    };
    tokio::spawn(read_task);
    Ok(())
}).map_err(|err| {
    error!("Accept error = {:?}", err);
});
tokio::run(server_task);
Run Code Online (Sandbox Code Playgroud)

这个伪代码只会执行我的任务一次。我如何连续运行它?我希望它执行,然后一次又一次执行等等。我只希望它在出现紧急情况或有错误结果代码时停止执行。最简单的方法是什么?

小智 1

使用loop_fn应该有效:

let read_task =
    futures::future::loop_fn((socket, in_buf, 0), |(socket, in_buf, bytes_read)| {
        if bytes_read > 0 { /* handle bytes */ }

        tokio::io::read(socket, in_buf).map(Loop::Continue)
    });
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,`loop_fn` 似乎不再存在于 futures 0.3 中 (4认同)