Rust WASM定时器库fluvio-wasm-timer的使用,提供高效跨平台时间管理与延迟处理功能
Rust WASM定时器库fluvio-wasm-timer的使用
概述
fluvio-wasm-timer 是一个 Rust 定时器库,提供了跨平台的时间管理和延迟处理功能。它导出了 Instant
、Delay
、Interval
和 Timeout
结构体:
- 在非 WASM 目标上,这些类型是从
tokio-timer
重新导出的 - 在 WASM 目标上,使用
web-sys
来实现它们的功能
安装
在项目目录中运行以下 Cargo 命令:
cargo add fluvio-wasm-timer
或在 Cargo.toml 中添加:
fluvio-wasm-timer = "0.2.5"
示例代码
以下是一个完整的使用示例,展示了如何在 WASM 中使用 fluvio-wasm-timer:
use fluvio_wasm_timer::{Delay, Instant};
use std::time::Duration;
#[wasm_bindgen(start)]
pub async fn main() {
// 测量时间间隔
let start = Instant::now();
Delay::new(Duration::from_secs(1)).await.unwrap();
let elapsed = start.elapsed();
console_log!("Elapsed: {:?} ms", elapsed.as_millis());
// 创建定时器
let interval = fluvio_wasm_timer::Interval::new(
Duration::from_secs(1),
);
// 使用定时器
for _ in 0..5 {
interval.next().await;
console_log!("Tick");
}
// 使用超时
let timeout = fluvio_wasm_timer::Timeout::new(
Duration::from_secs(3),
async {
console_log!("Timeout completed!");
}
);
timeout.await;
}
完整示例
以下是一个更完整的 WASM 示例,展示了如何使用 fluvio-wasm-timer 的各种功能:
use fluvio_wasm_timer::{Delay, Instant, Interval, Timeout};
use std::time::Duration;
use wasm_bindgen::prelude::*;
use web_sys::console;
#[wasm_bindgen(start)]
pub async fn run() {
// 1. 使用 Instant 测量时间
let start_time = Instant::now();
// 2. 使用 Delay 创建延迟
console::log_1(&"Waiting for 1 second...".into());
Delay::new(Duration::from_secs(1)).await.unwrap();
let elapsed = start_time.elapsed();
console::log_1(&format!("1 second delay took {} ms", elapsed.as_millis()).into());
// 3. 使用 Interval 创建周期性定时器
console::log_1(&"Starting interval timer (5 ticks at 500ms intervals)".into());
let mut interval = Interval::new(Duration::from_millis(500));
for i in 1..=5 {
interval.next().await;
console::log_1(&format!("Interval tick {}", i).into());
}
// 4. 使用 Timeout 带回调
console::log_1(&"Setting timeout for 2 seconds with callback".into());
let timeout = Timeout::new(
Duration::from_secs(2),
async {
console::log_1(&"Timeout callback executed!".into());
}
);
timeout.await;
console::log_1(&"All timer operations completed".into());
}
主要功能
- Instant - 用于测量时间间隔
- Delay - 用于创建延迟
- Interval - 用于创建周期性定时器
- Timeout - 用于创建带回调的超时机制
注意事项
这个分支主要是为了解决一个 WASM bug 而创建的临时解决方案。
1 回复
Rust WASM定时器库fluvio-wasm-timer使用指南
fluvio-wasm-timer
是一个专为 WebAssembly (WASM) 环境设计的 Rust 定时器库,提供了高效的跨平台时间管理和延迟处理功能。
主要特性
- 专为 WASM 环境优化
- 跨平台支持(浏览器和 Node.js)
- 轻量级实现
- 提供延迟和间隔定时器功能
- 与 Rust 异步生态良好集成
安装
在 Cargo.toml
中添加依赖:
[dependencies]
fluvio-wasm-timer = "0.4"
基本使用方法
1. 延迟执行 (Timeout)
use fluvio_wasm_timer::Delay;
use std::time::Duration;
async fn delayed_task() {
println!("任务将在2秒后执行");
Delay::new(Duration::from_secs(2)).await;
println!("任务已执行!");
}
// 在异步上下文中调用
// wasm_bindgen_futures::spawn_local(delayed_task());
2. 间隔定时器 (Interval)
use fluvio_wasm_timer::Interval;
use std::time::Duration;
async fn periodic_task() {
let mut interval = Interval::new(Duration::from_secs(1));
for i in 1..=5 {
interval.next().await;
println!("这是第 {} 次执行", i);
}
}
// 在异步上下文中调用
// wasm_bindgen_futures::spawn_local(periodic_task());
高级用法
取消定时器
use fluvio_wasm_timer::{Delay, Task};
use std::time::Duration;
async fn cancellable_timer() {
let delay = Delay::new(Duration::from_secs(5));
let task = Task::spawn(delay);
// 2秒后取消定时器
Delay::new(Duration::from_secs(2)).await;
task.cancel().await;
println!("定时器已取消");
}
与 wasm-bindgen 配合使用
use wasm_bindgen::prelude::*;
use fluvio_wasm_timer::Delay;
use std::time::Duration;
#[wasm_bindgen]
pub async fn start_timer() {
Delay::new(Duration::from_secs(1)).await;
web_sys::console::log_1(&"1秒后执行".into());
}
完整示例代码
以下是一个完整的 WASM 应用示例,展示了如何使用 fluvio-wasm-timer
:
use wasm_bindgen::prelude::*;
use fluvio_wasm_timer::{Delay, Interval};
use std::time::Duration;
#[wasm_bindgen]
pub struct TimerApp {
// 可以添加应用状态
}
#[wasm_bindgen]
impl TimerApp {
#[wasm_bindgen(constructor)]
pub fn new() -> Self {
TimerApp {}
}
// 延迟执行示例
pub async fn run_delay_example(&self) {
println!("延迟执行示例开始");
Delay::new(Duration::from_secs(3)).await;
println!("延迟3秒后执行");
}
// 间隔定时器示例
pub async fn run_interval_example(&self) {
println!("间隔定时器示例开始");
let mut interval = Interval::new(Duration::from_secs(1));
for i in 1..=5 {
interval.next().await;
println!("间隔执行: 第 {} 次", i);
}
}
// 可取消定时器示例
pub async fn run_cancellable_example(&self) {
println!("可取消定时器示例开始");
let delay = Delay::new(Duration::from_secs(5));
let task = Task::spawn(delay);
Delay::new(Duration::from_secs(2)).await;
task.cancel().await;
println!("定时器在2秒后被取消");
}
}
// 在浏览器中使用的入口点
#[wasm_bindgen(start)]
pub fn run() {
let app = TimerApp::new();
// 使用 wasm_bindgen_futures 来运行异步代码
wasm_bindgen_futures::spawn_local(async {
app.run_delay_example().await;
app.run_interval_example().await;
app.run_cancellable_example().await;
});
}
注意事项
- 该库专为 WASM 环境设计,在非 WASM 环境下可能无法正常工作
- 所有定时操作都是异步的,需要在异步上下文中使用
- 对于浏览器环境,通常与
wasm-bindgen-futures
配合使用
性能建议
- 避免创建大量短间隔定时器
- 不再需要的定时器应及时取消
- 对于高频定时需求,考虑使用单个定时器加状态管理
fluvio-wasm-timer
为 Rust WASM 应用提供了简单可靠的定时功能,特别适合需要跨平台时间管理的应用场景。