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 次下载
24KB
406 代码行
并行状态行
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();
}
依赖关系
~4–11MB
~99K SLoC