根据官方文档 select! 是一个并发异步宏,但只返回第一个计算结果,未完成的分支将会被drop。
async fn tokio_select() {
let mut sec10 = tokio::time::interval(Duration::from_secs(10));
let mut sec20 = tokio::time::interval(Duration::from_secs(20));
loop
{
tokio::select! {
v10 = sec10.tick() => {
println!("{:?}", v10);
}
v20 = sec20.tick() => {
println!("{:?}", v20);
}
}
}
}
按照这个说,上述代码不是应该是每次循环只有 sec10 这个计时器被触发么? 为什么实际的结果,sec10 以及 sec20 都按照预定的时间间隔在触发?
1
共 6 条评论, 1 页
评论区
写评论第一次tick不消耗时间,此时计时器已经开始了,注意是&mut self
drop只是放弃了一次通知回调,并不影响计时器tick累计
@Klad @fakeshadow @Neutron3529
感谢大家的解答~ 明白是怎么回事了。 https://docs.rs/tokio/latest/tokio/macro.select.html#cancellation-safety
关键词: cancel safety
https://developers.redhat.com/blog/2014/09/10/multi-thread-async-signal-and-async-cancel-safety-docs-in-gnu-libc
建议阅读文档中关于cancel safety的说明 https://docs.rs/tokio/1.22.0/tokio/time/struct.Interval.html#cancel-safety
胆子再大也不敢算到一半就drop的
你可以思考一下,一个线程在拿锁之后drop,是一件多么美妙的事情