在学习Rust tokio多线程时发现一个现象,不知道为什么。
这是代码。
use std::{thread, time::Duration};
use chrono::Local;
fn now() -> String {
Local::now().format("%F %T").to_string()
}
async fn async_task(i: u64) {
thread::sleep(Duration::from_secs(i));
println!("{}.async task {}!", now(), i);
}
#[tokio::main]
async fn main() {
for i in 0..10 {
tokio::spawn(async_task(i));
}
println!("{}.main thread", now());
}
我运行代码,发现每10个异步任务都被执行了。结果如下
2023-09-05 22:08:05.async task 0!
2023-09-05 22:08:05.main thread
2023-09-05 22:08:06.async task 1!
2023-09-05 22:08:07.async task 2!
2023-09-05 22:08:08.async task 3!
2023-09-05 22:08:09.async task 4!
2023-09-05 22:08:10.async task 5!
2023-09-05 22:08:11.async task 6!
2023-09-05 22:08:12.async task 7!
2023-09-05 22:08:13.async task 8!
2023-09-05 22:08:14.async task 9!
当我注释掉线程println
中的代码时main
,只有少数任务会被执行。
#[tokio::main]
async fn main() {
for i in 0..10 {
tokio::spawn(async_task(i));
}
// println!("{}.main thread", now());
}
结果如下
2023-09-05 22:10:51.async task 0!
2023-09-05 22:10:52.async task 1!
我已经尝试过很多次了,每次都会出现这种差异。每次尝试时,未注释掉的代码println
都会执行所有异步任务,而另一个则不会。
我真的不明白为什么aprintln
可以产生如此大的影响。如果有人能提供帮助,我将不胜感激。