繁体   English   中英

如何使用 Tokio 在每个周期或间隔以秒为单位触发 function?

[英]How can I use Tokio to trigger a function every period or interval in seconds?

在 Node.js 我可以设置触发某个事件的时间间隔,

function intervalFunc() {
  console.log('whelp, triggered again!');
}

setInterval(intervalFunc, 1500);

然而,Tokio间隔的界面有点复杂。 这似乎与间隔的更字面定义有关,而不是按间隔调用 function,它只是停止线程直到时间过去(使用.await )。

Tokio 中是否有一个原语“每隔 x 秒”调用 function 之类的? 如果没有,是否出现了一个成语来做到这一点?

我只需要定期运行一个 function ......我也不关心其他线程。 它只是 Tokio 事件循环中的一个 function。

生成一个 Tokio 任务以永远做某事:

use std::time::Duration;
use tokio::{task, time}; // 1.3.0

#[tokio::main]
async fn main() {
    let forever = task::spawn(async {
        let mut interval = time::interval(Duration::from_millis(10));

        loop {
            interval.tick().await;
            do_something().await;
        }
    });

    forever.await;
}

您还可以使用tokio::time::interval创建一个可以重复勾选的值。 执行打勾并在stream::unfold的主体内调用 function 以创建 stream:

use futures::{stream, StreamExt}; // 0.3.13
use std::time::{Duration, Instant};
use tokio::time; // 1.3.0

#[tokio::main]
async fn main() {
    let interval = time::interval(Duration::from_millis(10));

    let forever = stream::unfold(interval, |mut interval| async {
        interval.tick().await;
        do_something().await;
        Some(((), interval))
    });

    let now = Instant::now();
    forever.for_each(|_| async {}).await;
}

async fn do_something() {
    eprintln!("do_something");
}

也可以看看:

我仍然是 rust/tokio 的初学者,但我确实发现这个解决方案对我自己有帮助:

use std::time::Duration;
use tokio::time;
use tokio_stream::wrappers::IntervalStream;

#[tokio::main]
async fn main() {
    let mut stream = IntervalStream::new(time::interval(Duration::from_secs(1)));

    while let Some(_ts) = stream.next().await {
        println!("whelp, triggered again!");
    }
}

请注意, _ts包含执行时间戳。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM