6 个版本
0.3.0 | 2022 年 5 月 18 日 |
---|---|
0.2.2 | 2022 年 2 月 21 日 |
0.2.1 | 2021 年 6 月 12 日 |
0.2.0 | 2021 年 5 月 28 日 |
0.1.1 | 2020 年 12 月 20 日 |
437 在 命令行界面 中
每月 320 次下载
用于 10 个 Crates(7 个直接使用)
19KB
182 行
linya
简单并发进度条。
特性
- 直观的 API。
- 一流支持
rayon
等。 - 高效,无需分配的重绘。
- 动态添加新的子进度条。
- 单线程多进度条。
- 轻量级,仅有一个依赖项。
用法
linya
是针对多进度条场景设计的,与其他进度条库不同,没有单独的进度条类型。相反,我们使用 Progress
类型,一个“进度条协调器”。
多进度条
要在线程间可变地访问 Progress
,必须将其包装在常规的 并发共享类型 中。对于 rayon
而言,只需要 Mutex
。
use std::sync::Mutex;
use linya::{Bar, Progress};
use rayon::prelude::*;
let progress = Mutex::new(Progress::new());
// `into_par_iter()` is from `rayon`, and lets us parallelize some
// operation over a collection "for free".
(0..10).into_par_iter().for_each(|n| {
let bar: Bar = progress.lock().unwrap().bar(50, format!("Downloading {}", n));
// ... Your logic ...
// Increment the bar and draw it immediately.
// This is likely called in some inner loop or other closure.
progress.lock().unwrap().inc_and_draw(&bar, 10);
});
请注意,新进度条是在派生线程中动态添加的。我们调用 Progress::bar
来获取一个新的“进度条句柄”,然后在增加/绘制时将该句柄传递回父 Progress
。
请参阅 Progress::inc_and_draw
和 Progress::set_and_draw
来推进并渲染进度条。
单进度条
Progress
也可以在单线程上下文中用于单个进度条。用法相同,只是不需要锁定。
use linya::{Bar, Progress};
let mut progress = Progress::new();
let bar: Bar = progress.bar(50, "Downloading");
// Use in a loop, etc.
progress.set_and_draw(&bar, 10);
这样,您甚至可以在单线程上下文中使用多进度条。
注意事项
以下某些点可能在未来的版本中得到修复。
- 您的终端必须支持 ANSI 代码。
- 没有专门的渲染线程,以保持使用简单。
- 没有进度条模板,以避免依赖。
- 没有其他进度条样式(尚未)。
- 没有“速率”,因为重绘不是基于时间的。
- 完成后没有清除进度条。
- 没有旋转指示器,也因为没有时间感。
- 如果窗口大小发生变化,进度条不会动态调整大小。
如果您需要更多可定制的进度条并且愿意接受更重的依赖项,请考虑 indicatif。
请注意,同时使用多个 Progress
会导致未指定行为。
趣闻轶事
林亚 是昆雅语中“池塘”的意思,例如一个美丽的山间池塘。
依赖项
~220KB