set_timer 0.1.4

Robust interval execution for Rust, supporting async and sync closures. / Rust 健壮的定时间隔执行库,支持异步和同步闭包。
Documentation
# set_timer : Rust 健壮的定时间隔执行库

> Rust 健壮的定时间隔执行库,支持基于 Tokio 的异步和同步闭包。

## 功能特性

- **双模式支持**:无缝支持同步和异步闭包的执行。
- **Tokio 集成**:基于强大的 `tokio` 运行时构建,确保高效的任务调度。
- **轻松取消**:返回 `JoinHandle`,允许立即且干净地中止任务。
- **熟悉接口**:API 设计致敬 JavaScript 的 `setInterval`,同时兼具 Rust 的安全性和高性能。

## 使用演示

在 `Cargo.toml` 中添加依赖:

```toml
[dependencies]
set_timer = "0.1.0"
```

### 同步间隔执行

适用于简单的阻塞操作或快速计算:

```rust
use std::time::Duration;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
use set_timer::set_timer;

#[tokio::main]
async fn main() {
    let count = Arc::new(AtomicUsize::new(0));
    let count_clone = count.clone();

    // 每 100ms 执行一次
    let handle = set_timer(
        move || {
            count_clone.fetch_add(1, Ordering::SeqCst);
            println!("Tick");
        },
        Duration::from_millis(100),
    );

    // 运行一段时间
    tokio::time::sleep(Duration::from_millis(350)).await;

    // 停止执行
    handle.abort();
}
```

### 异步间隔执行

适用于涉及 I/O、网络请求或其他异步任务的操作:

```rust
use std::time::Duration;
use set_timer::set_timer_async;

#[tokio::main]
async fn main() {
    let handle = set_timer_async(
        || async {
            // 在此执行异步工作
            println!("Async Tick");
        },
        Duration::from_millis(100),
    );

    tokio::time::sleep(Duration::from_millis(350)).await;
    handle.abort();
}
```

## 设计思路

本库利用了 Tokio 轻量级的任务生成系统。

1.  **任务生成**:调用 `set_timer` 或 `set_timer_async` 时,会使用 `tokio::spawn` 生成一个新的 Tokio 任务。
2.  **循环执行**:在任务内部,建立一个无限 `loop` 循环。
3.  **执行与等待**:
    - 执行提供的闭包(如果是异步则进行 `await`)。
    - 循环随后使用 `tokio::time::sleep` 暂停执行指定的 `period` 时长。
4.  **资源管理**:返回的 `JoinHandle` 作为控制机制。丢弃句柄不会停止任务,但在其上调用 `.abort()` 会立即终止循环,确保资源被释放。

## 技术堆栈

- **语言**:Rust (Edition 2024)
- **运行时**:Tokio (异步运行时, 时间工具)
- **测试**:Tokio Test, Aok

## 目录结构

```
.
├── Cargo.toml          # 项目配置及依赖
├── src/
│   └── lib.rs          # 核心库逻辑 (set_timer, set_timer_async)
└── tests/
    └── main.rs         # 集成测试及使用示例
```

## API 参考

### `set_timer`

```rust
pub fn set_timer<F>(func: F, period: Duration) -> JoinHandle<()>
where
    F: Fn() + Send + Sync + 'static
```

以固定的时间间隔 `period` 重复执行同步闭包 `func`。

### `set_timer_async`

```rust
pub fn set_timer_async<F, Fut>(func: F, period: Duration) -> JoinHandle<()>
where
    F: Fn() -> Fut + Send + Sync + 'static,
    Fut: Future<Output = ()> + Send
```

重复执行异步闭包 `func`。`period` 延迟会在 `func` 返回的 Future 完成后开始计算。

## 历史背景

`setInterval` 的概念源于 Web 开发的早期阶段。虽然通常与 JavaScript 联系在一起,但它实际上并不是 ECMAScript 核心规范的一部分。相反,它是作为 Web 浏览器(`Window` 接口)提供的“宿主环境”API 引入的,后来被 Node.js 采纳。

它成为了动态网页的基石,实现了从简单的数字时钟到复杂的轮询机制和动画等各种功能。本 crate 旨在将这一重要的实用工具带入 Rust 生态系统,并针对现代异步系统编程进行了适配。