8 个版本

0.1.4 2023 年 8 月 18 日
0.1.3 2023 年 8 月 18 日
0.1.2 2022 年 12 月 21 日
0.0.3 2022 年 6 月 21 日

462并发

每月 31 次下载

MIT 许可证

24KB
406 代码行

并行状态行

crates.io rustc

parsli 是一个有偏见的 Rust 库,用于可视化依赖任务的执行。它旨在尽可能灵活,同时抽象出依赖管理和命令行可视化。

快速入门

一切通过 ThreadPool 结构体来管理,该结构体负责依赖和状态行。

use parsli::ThreadPool;

// Execute 4 tasks in parallel
let mut pool = ThreadPool::new(4);

一个任务有一个名称、依赖关系和它必须执行的一些函数。这个函数有三个参数

  • line:可以控制的此线程的状态行。
  • name:此任务的名称。
  • ctx:一个 hashmap,包含此任务依赖的任务的结果。以下是如何实例化任务的简单示例。
use std::thread::sleep;
use std::time::Duration;
use parsli::{Task, Line, Ctx};

let mytask = Task::new(|line: Line, name: String, ctx: Ctx<String>| {
    line.update_message("preparing...".to_string());
    sleep(Duration::from_millis(1000));
    line.update_message("processing...".to_string());
    sleep(Duration::from_millis(2000));
    Ok("this is the result".to_string())
});

可以使用 ThreadPool::add_task 函数将任务添加到池中。

pool.add_task("mytask", vec![], mytask);

当所有任务都已添加到池中时,可以使用 ThreadPool::start 启动它。

pool.start();

完整示例

use std::thread::sleep;
use std::time::Duration;
use parsli::{Ctx, Line, ThreadPool, Task};

/// This is a minimal example on how to use parsli
fn main() {
    let mut pool = ThreadPool::new(4);
    let dummy = Task::new(|line: Line, name: String, ctx: Ctx<String>| {
        line.update_message("preparing...".to_string());
        sleep(Duration::from_millis(1000 + 10 * (rand::random::<u8>() as u64)));
        if name != "clang.install".to_string() {
            Ok("this is the result".to_string())
        } else {
            Err("this task went terribly wrong".to_string())
        }
    });
    pool.add_task("llvm.fetch", vec![], dummy.clone());
    pool.add_task("clang.configure", vec!["llvm.fetch"], dummy.clone());
    pool.add_task("compiler-rt.configure", vec!["llvm.fetch"], dummy.clone());
    pool.add_task("clang.compile", vec!["clang.configure"], dummy.clone());
    pool.add_task("compiler-rt.compile", vec!["compiler-rt.configure"], dummy.clone());
    pool.add_task("clang.install", vec!["clang.compile"], dummy.clone());
    pool.add_task("compiler-rt.install", vec!["compiler-rt.compile"], dummy.clone());
    pool.start();
}

animation

依赖关系

~4–11MB
~99K SLoC