如何使用 Tokio 以秒为单位在每个周期或间隔触发一个函数?
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 interval 的界面有点复杂。这似乎与间隔的更字面定义有关,而不是按间隔调用函数,它只是停止线程直到时间过去(.await
)。
Tokio 中是否有一个原语可以调用一个函数 “每隔 x 秒” 之类的?如果没有,是否出现了这样的成语?
我只需要 运行 一个周期性的函数...我也不关心其他线程。它只是 Tokio 事件循环中的一个函数。
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
to create a value that you can tick repeatedly. Perform the tick and call your function inside of the body of 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");
}
另请参阅:
- How can I run a set of functions concurrently on a recurring interval without running the same function at the same time using Tokio?
在Node.js中我可以设置触发某个事件的时间间隔,
function intervalFunc() {
console.log('whelp, triggered again!');
}
setInterval(intervalFunc, 1500);
但是 Tokio interval 的界面有点复杂。这似乎与间隔的更字面定义有关,而不是按间隔调用函数,它只是停止线程直到时间过去(.await
)。
Tokio 中是否有一个原语可以调用一个函数 “每隔 x 秒” 之类的?如果没有,是否出现了这样的成语?
我只需要 运行 一个周期性的函数...我也不关心其他线程。它只是 Tokio 事件循环中的一个函数。
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
to create a value that you can tick repeatedly. Perform the tick and call your function inside of the body of 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");
}
另请参阅:
- How can I run a set of functions concurrently on a recurring interval without running the same function at the same time using Tokio?