gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:16:00 25 4
gpt4 key购买 nike

我正在用使用 Tokio 的异步等效代码替换用 Rust 编写的同步套接字代码。 Tokio 将 futures 用于异步事件,因此任务被链接在一起并排队到执行器上以由线程池执行。

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

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);

此伪代码只会执行我的任务一次。我如何连续运行它?我希望它执行然后一次又一次地执行等。我只希望它在 panic 或有错误结果代码时停止执行。最简单的方法是什么?

最佳答案

使用 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)
});

关于rust - 如何在 Tokio 中安排重复任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49254699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com