Rust WASM定时器库fluvio-wasm-timer的使用,提供高效跨平台时间管理与延迟处理功能

Rust WASM定时器库fluvio-wasm-timer的使用

概述

fluvio-wasm-timer 是一个 Rust 定时器库,提供了跨平台的时间管理和延迟处理功能。它导出了 InstantDelayIntervalTimeout 结构体:

  • 在非 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());
}

主要功能

  1. Instant - 用于测量时间间隔
  2. Delay - 用于创建延迟
  3. Interval - 用于创建周期性定时器
  4. 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;
    });
}

注意事项

  1. 该库专为 WASM 环境设计,在非 WASM 环境下可能无法正常工作
  2. 所有定时操作都是异步的,需要在异步上下文中使用
  3. 对于浏览器环境,通常与 wasm-bindgen-futures 配合使用

性能建议

  • 避免创建大量短间隔定时器
  • 不再需要的定时器应及时取消
  • 对于高频定时需求,考虑使用单个定时器加状态管理

fluvio-wasm-timer 为 Rust WASM 应用提供了简单可靠的定时功能,特别适合需要跨平台时间管理的应用场景。

回到顶部