#runner #cron #job #worker #schedule #thread #worker-thread

cron_runner

定时任务运行器,用于运行计划中的作业

4 个版本

0.1.3 2024年8月12日
0.1.2 2024年8月12日
0.1.1 2024年8月12日
0.1.0 2024年8月12日

#10#worker-thread

Download history 360/week @ 2024-08-09

每月下载量 360

MIT 许可证

22KB
382

cron_runner

使用 Job 特性在你的结构体上定义作业,将作业传递给运行器并使用 run() 启动它。运行器将创建一个主要的“监控”线程来调度作业,并创建额外的工作线程来运行作业。

运行器可以在两种模式下运行。

池化

使用 n > 0 个线程启动它,这些线程将存在于线程池中,等待从 mpsc 通道(在本上下文中用作 FIFO 队列)接收新作业。当工作线程等待时,它们将阻塞在 recv() 上。如果所有工作线程都忙碌,则新作业将不会运行,直到有一个工作线程空闲。首先被调度的作业将首先被工作线程选取并运行。

非池化

如果您使用 0 个工作线程启动运行器,每当作业应该运行时,将为执行它的作业创建一个新的线程。如果由于某种原因无法创建工作线程,运行器将尝试在其主线程中运行作业,直到完成,否则会阻塞其他作业的调度。

示例

 use cron_runner::{Job, Runner, Schedule};

 struct PrintJob {
     message: String,
 }

 impl Job for PrintJob {
     fn execute(&self) {
         println!("{}", self.message);
     }

     fn schedule(&self) -> Schedule {
         "0 * * * * *".parse().unwrap()
     }
 }

 fn main() {
     let mut runner = Runner::new(2);

     runner.add_job(Box::new(PrintJob {
         message: "Print job".to_string(),
     }));

     runner.run();

     loop {
         std::thread::sleep(std::time::Duration::from_secs(5));
     }
 }

##输出

Output:
Worker started job 0 at 15:12:59.632829567
Print job
Worker finished job 0 at 15:12:59.632854926

依赖项

~2–7.5MB
~48K SLoC