Search code examples
asynchronousrustasync-awaitspawnrust-tokio

Why tokio::spawn doesn't execute my code?


My rust code is like below.

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

When run the code, I expect it to print 1 to 10 in a random sequence. But it just print some random numbers:

1
3
2
Terminal will be reused by tasks, press any key to close it.

Why this is happenning?


Solution

  • https://docs.rs/tokio/latest/tokio/fn.spawn.html warns that:

    There is no guarantee that a spawned task will execute to completion. When a runtime is shutdown, all outstanding tasks are dropped, regardless of the lifecycle of that task.

    One solution that should work is to store all of the JoinHandles and then await all of them:

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

    P.S. In 1..10, the end is exclusive, so the last number is 9. You might want 1..=10 instead. (see https://doc.rust-lang.org/reference/expressions/range-expr.html)