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
每月下载量 360
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