You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust使用ScheduledThreadPool创建守护进程如何保持永久运行?

问题原因

Rust进程的生命周期完全绑定main函数,main返回后操作系统会直接回收所有进程资源,无论后台是否还有运行的子线程。你用到的scheduled_thread_pool的execute_at_fixed_rate方法会立即返回,不会阻塞调用线程,所以main函数会直接执行完毕,导致进程退出,定时任务随之终止。

解决方案

你只需要阻塞main函数,不让它返回即可,常用的实现方式有以下两种:


方案1:最简无限休眠(无优雅退出)

直接在main函数末尾添加无限循环的休眠逻辑,该方案几乎不占用CPU资源,满足永久运行的基本需求:

use scheduled_thread_pool::ScheduledThreadPool;
use std::time::Duration;

fn do_business_logic() {
    // 此处为你的业务逻辑
    println!("定时任务执行");
}

fn main() {
    let pool = ScheduledThreadPool::new(1);
    pool.execute_at_fixed_rate(
        Duration::new(5, 0),
        Duration::new(5, 0),
        move || do_business_logic(),
    );

    // 无限阻塞main函数,防止进程退出
    loop {
        std::thread::sleep(Duration::from_secs(3600));
    }
}

方案2:支持优雅退出

如果需要响应系统中断信号(比如用户按下Ctrl+C)、退出前清理资源,可以监听系统信号,收到终止信号后再退出main函数:

  1. 先在Cargo.toml中添加依赖:
    [dependencies]
    scheduled-thread-pool = "0.2"
    signal-hook = "0.3"
    
  2. 完整代码示例:
    use scheduled_thread_pool::ScheduledThreadPool;
    use signal_hook::{consts::SIGINT, iterator::Signals};
    use std::time::Duration;
    
    fn do_business_logic() {
        println!("定时任务执行");
    }
    
    fn main() {
        let pool = ScheduledThreadPool::new(1);
        pool.execute_at_fixed_rate(
            Duration::new(5, 0),
            Duration::new(5, 0),
            move || do_business_logic(),
        );
    
        // 监听SIGINT中断信号
        let mut signals = Signals::new(&[SIGINT]).unwrap();
        for signal in signals.forever() {
            if signal == SIGINT {
                println!("收到终止信号,进程即将退出");
                // 此处可添加自定义清理逻辑
                break;
            }
        }
    }
    

内容的提问来源于stack exchange,提问作者Steve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:54:03