< 返回版块

rascalrr 发表于 2022-12-01 17:33

Tags:tokio select!

根据官方文档 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 都按照预定的时间间隔在触发?

评论区

写评论
dlhxzb 2022-12-02 09:21

第一次tick不消耗时间,此时计时器已经开始了,注意是&mut self
drop只是放弃了一次通知回调,并不影响计时器tick累计

作者 rascalrr 2022-12-02 09:06

@Klad @fakeshadow @Neutron3529

感谢大家的解答~ 明白是怎么回事了。 https://docs.rs/tokio/latest/tokio/macro.select.html#cancellation-safety

Klad 2022-12-01 21:44

关键词: cancel safety

Klad 2022-12-01 21:44

https://developers.redhat.com/blog/2014/09/10/multi-thread-async-signal-and-async-cancel-safety-docs-in-gnu-libc

fakeshadow 2022-12-01 18:34

建议阅读文档中关于cancel safety的说明 https://docs.rs/tokio/1.22.0/tokio/time/struct.Interval.html#cancel-safety

Neutron3529 2022-12-01 18:24

胆子再大也不敢算到一半就drop的

你可以思考一下,一个线程在拿锁之后drop,是一件多么美妙的事情

1 共 6 条评论, 1 页