2 个版本
0.1.2 | 2019年11月29日 |
---|---|
0.1.1 | 2019年11月29日 |
#19 在 #extern
每月 23 次下载
38KB
609 行
Izta - Rust 异步任务调度器
Izta 是 Rust 的异步工作队列,它设计用于在大多数 Rust 应用程序中运行,无需更改软件架构或系统基础设施。它可以在应用程序进程内部作为单独的线程运行,也可以在单独的服务器上独立运行。多个实例可以并发运行以并行执行任务。Izta 还实现了命名队列,以便一个队列中的任务可以由 Izta 实例 A 处理,而另一个队列中的任务可以由 Izta 实例 B 处理 - 允许繁忙的队列独立于其他队列进行扩展。目前,Postgres 是唯一支持的数据库后端。
示例
在开始工作队列之前,需要定义工作本身。任何实现了 Job
(请参阅 Job
文档以获取更多详细信息)、Serialize
和 Deserialize
特性的结构体都是有效的工作类型。
以下是一个简单地执行两个数相除的工作示例
#[macro_use] extern crate serde;
use izta::job::Job;
// Jobs can be any type that implements the Job, Serialize and Deserialize traits
#[derive(Serialize, Deserialize)]
struct DivideJob {
a: i64,
b: i64,
}
// Jobs must have a serializable error type. Could be `()` for jobs that always succeed
#[derive(Serialize, Deserialize)]
enum DivideJobErr {
DivideByZero,
}
impl Job for DivideJob {
// Specify the result and error types
type R = i64;
type E = DivideJobErr;
// All jobs must have a UUID
const UUID: &'static str = "74f3a15b-75c0-4889-9546-63b02ff304e4";
const MAX_ATTEMPTS: usize = 3;
// Job logic - return an `Err` for errors and `Ok` if successful.
fn run(&self) -> Result<Self::R, Self::E> {
if self.b == 0 {
return Err(DivideJobErr::DivideByZero);
}
Ok(self.a / self.b)
}
}
定义工作后,我们现在可以创建一个任务运行器
#
#
#
#
#
#
use izta::process_jobs;
use izta::runner::Runner;
let runner = Runner::new(
process_jobs!(DivideJob),
"postgres://izta:password@localhost:5432/izta_test",
"tasks",
vec![],
);
使用 TaskReq::new
方法定义和添加任务很容易
#
#
#
#
#
#
use izta::task::task_req::TaskReq;
let task_req = TaskReq::new(DivideJob { a: 1, b: 2 });
runner.add_task(&task_req);
启动任务运行器将开始执行任务
#
#
#
#
#
#
#
runner.start();
当然,在启动任务运行器之后添加新任务也是可能的。多次运行 start()
将会启动多个任务运行器实例,这些实例将并行执行任务。
依赖关系
~7MB
~159K SLoC