为什么 tokio::spawn 不执行我的代码?

luc*_*ian 1 asynchronous spawn rust async-await rust-tokio

我的 Rust 代码如下所示。

#[tokio::main]
pub async fn main() {
    for i in 1..10 {
        tokio::spawn(async move {
            println!("{}", i);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

运行代码时,我希望它以随机顺序打印 1 到 10。但它只是打印一些随机数:

1
3
2
终端将被任务重复使用,按任意键关闭它。

为什么会发生这种情况?

Sol*_*cko 6

https://docs.rs/tokio/latest/tokio/fn.spawn.html警告:

无法保证生成的任务将执行完成。当运行时关闭时,所有未完成的任务都将被删除,无论该任务的生命周期如何。

一种可行的解决方案是存储所有JoinHandles,然后await存储所有它们:

let mut join_handles = Vec::with_capacity(10);

for i in 1..10 {
    join_handles.push(tokio::spawn(async move {
        println!("{}", i);
    }));
}

for join_handle in join_handles {
    join_handle.await.unwrap();
}
Run Code Online (Sandbox Code Playgroud)

PS 在 中1..10,结尾是互斥的,因此最后一个数字是 9。您可能需要1..=10改为。(参见https://doc.rust-lang.org/reference/expressions/range-expr.html