我正在创建一个任务,这个任务将会派生其他任务。其中一些任务需要一定的时间来完成,因此它们不能被等待,但是它们可以并行运行:
src/main.rs
use crossbeam::crossbeam_channel::{bounded, select};
#[tokio::main]
async fn main() {
let (s, r) = bounded::<usize>(1);
tokio::spawn(async move {
let mut counter = 0;
loop {
let loop_id = counter.clone();
tokio::spawn(async move { // why this one was not fired?
println!("inner task {}", loop_id);
}); // .await.unwrap(); - solves issue, but this is long task which cannot be awaited
println!("loop {}", loop_id);
select! {
recv(r) -> rr => {
// match rr {
// Ok(ee) => {
// println!("received from channel {}", loop_id);
// tokio::spawn(async move {
// println!("received from channel task {}", loop_id);
// });
// },
// Err(e) => println!("{}", e),
// };
},
// more recv(some_channel) ->
}
counter = counter + 1;
}
});
// let s_clone = s.clone();
// tokio::spawn(async move {
// s_clone.send(2).unwrap();
// });
loop {
// rest of the program
}
}
我注意到了奇怪的行为。这个输出:
loop 0
我本以为它也会输出
inner task 0
。如果我向通道发送一个值,输出将是:
loop 0
inner task 0
loop 1
这里缺少了内部任务1
。
为什么内部任务
会延迟一次循环后再启动?
我第一次注意到这种行为是在“从通道接收任务”中出现一个延迟的一次循环,但是当我缩小代码以准备样本时,这种情况开始发生在“内部任务”中。可能值得一提的是,如果我将第二个tokio::spawn
直接写在另一个tokio::spawn
后面,只有最后一个会出现这个问题。在调用tokio::spawn
和select!
时,是否有什么需要注意的地方?是什么导致了这一次循环的延迟?
Cargo.toml 依赖项
[dependencies]
tokio = { version = "0.2", features = ["full"] }
crossbeam = "0.7"
Rust 1.46,Windows 10