2 个不稳定版本

0.2.0 2021 年 4 月 12 日
0.1.0 2020 年 10 月 18 日

#1104异步

MIT/Apache

29KB
562

async-jobs

Rust 的异步工作编排

许可证

根据以下任一许可证授权:

由您选择。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交的包含在作品中的任何贡献,都将如上所述双重许可,不附加任何额外条款或条件。


lib.rs:

async-jobs 包提供了一种描述和执行一系列相互依赖和异步工作的框架。它旨在用作需要编排具有复杂依赖图的任意任务集合的程序(如构建系统)的调度骨干。

使用此包的主要方式是创建 IntoJob 特质的实现来描述程序中的任务以及它们之间如何相互依赖。要运行您的任务,创建一个 Scheduler 并将其 run 方法传递给工作。

工作对类型 CE 是泛型的,分别代表用户定义的上下文和错误类型。上下文机制为所有工作提供了访问一些共享数据的手段;有关更多信息,请参阅 Scheduler。错误类型允许工作返回任意错误值,该值通过调度器传播。请注意,同一工作图中的所有工作都必须使用相同的类型用于 CE

示例

#[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