rust 如何使用时雄在每个周期或间隔(以秒为单位)触发函数?

wlzqhblo  于 2023-01-13  发布在  其他
关注(0)|答案(2)|浏览(172)

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

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

setInterval(intervalFunc, 1500);

但是时雄的interval的接口要复杂一些,它似乎与更字面的间隔定义有关,它不是在某个间隔调用函数,而是简单地停止线程直到时间过去(使用.await)。
在时雄中有没有一个原语可以调用一个函数 “每x秒” 或类似的东西?如果没有,有没有一个成语已经出现来做这件事?
我只需要在一个循环间隔上运行一个函数......我也不关心其他线程。它只是时雄事件循环上的一个函数。

flvlnr44

flvlnr441#

Spawn a Tokio task永远做某事:

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主体内的函数来创建一个流:

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

另见:

yyhrrdl8

yyhrrdl82#

我仍然是一个Rust/时雄初学者,但我确实发现这个解决方案对自己很有帮助:

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保存执行时间戳。

相关问题