2 个不稳定版本
0.2.0 | 2021 年 4 月 12 日 |
---|---|
0.1.0 | 2020 年 10 月 18 日 |
#1104 在 异步
29KB
562 行
async-jobs
Rust 的异步工作编排
许可证
根据以下任一许可证授权:
- Apache License,版本 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT License (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交的包含在作品中的任何贡献,都将如上所述双重许可,不附加任何额外条款或条件。
lib.rs
:
async-jobs
包提供了一种描述和执行一系列相互依赖和异步工作的框架。它旨在用作需要编排具有复杂依赖图的任意任务集合的程序(如构建系统)的调度骨干。
使用此包的主要方式是创建 IntoJob
特质的实现来描述程序中的任务以及它们之间如何相互依赖。要运行您的任务,创建一个 Scheduler
并将其 run
方法传递给工作。
工作对类型 C
和 E
是泛型的,分别代表用户定义的上下文和错误类型。上下文机制为所有工作提供了访问一些共享数据的手段;有关更多信息,请参阅 Scheduler
。错误类型允许工作返回任意错误值,该值通过调度器传播。请注意,同一工作图中的所有工作都必须使用相同的类型用于 C
和 E
。
示例
#[derive(PartialEq)]
struct Foo(usize);
impl IntoJob<(), ()> for Foo {
fn into_job(&self) -> Job<(), ()> {
let num = self.0;
Box::new(move |_| Box::pin(async move {
println!("foo: {}", num);
Ok(Outcome::Success)
}))
}
}
#[derive(PartialEq)]
struct Bar(usize);
impl IntoJob<(), ()> for Bar {
fn plan(&self, plan: &mut PlanBuilder<(), ()>) -> Result<(), Error<()>> {
plan.add_dependency(Foo(self.0 + 1))?;
plan.add_dependency(Foo(self.0 + 2))?;
Ok(())
}
fn into_job(&self) -> Job<(), ()> {
let num = self.0;
Box::new(move |_| Box::pin(async move {
println!("bar: {}", num);
Ok(Outcome::Success)
}))
}
}
let mut sched = Scheduler::new();
async_std::task::block_on(sched.run(Bar(7)));
依赖关系
~0.7–1MB
~18K SLoC