Kev*_*ata 1 multithreading infinite-loop rust
我func1, func2, func3在结构对象上有 3 种不同的异步方法。
我想要完成的是这样的:
loop {
obj.func1().await;
set_timeout(Duration::from_secs(5)).await;
}
loop {
obj.func2().await;
set_timeout(Duration::from_secs(5)).await;
}
loop {
obj.func3().await;
set_timeout(Duration::from_secs(5)).await;
}
Run Code Online (Sandbox Code Playgroud)
我希望所有这 3 个循环并行运行。显然,在这种形式下它不起作用,因为第二个和第三个循环将无法到达。
我想到了以下解决方案:
loop {
thread::spawn(move || async move {
obj.func1().await;
obj.func2().await;
obj.func3().await;
set_timeout(Duration::from_secs(5)).await;
});
}
Run Code Online (Sandbox Code Playgroud)
但它有两个问题:
Copy特征(使用一些第三方板条箱,因此不能在那里做太多事情)。我应该如何处理这个问题?
您可以使用一个async块来创建一个新的 future,因此如果您将每个循环包装在一个async块中,您将获得三个 future。然后你可以使用join!宏同时等待它们:
let fut1 = async {
loop {
obj.func1().await;
set_timeout(Duration::from_secs(5)).await;
}
};
let fut2 = async {
loop {
obj.func2().await;
set_timeout(Duration::from_secs(5)).await;
}
};
let fut3 = async {
loop {
obj.func3().await;
set_timeout(Duration::from_secs(5)).await;
}
};
join!(fut1, fut2, fut3);
Run Code Online (Sandbox Code Playgroud)
宏观join!将驱动期货。
或者,您的异步运行时可能有一种方法将 future 作为新的独立任务提交,例如tokio::spawn.