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

问题描述

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

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

setInterval(intervalFunc,1500);

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

Tokio 中是否有一个原语可以“每 x 秒” 或类似的调用函数?如果没有,是否已经出现了一个成语来做到这一点?

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

解决方法

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

你也可以生成一个 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;
}

另见:

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...