2个不稳定版本
0.3.0 | 2022年8月8日 |
---|---|
0.2.0 | 2022年8月5日 |
#631 在 并发
129 每月下载量
在 2 crates 中使用
23KB
345 行
🦫 proglog
这是一个简单、线程安全、基于计数的进度记录器。
概述
proglog
集成到你的现有 log
实现中(即 env_logger
),每当它看到 unit
个项目时,就会输出一个日志消息。有两个主要方法,record()
和 record_with(Fn() -> impl Display)
。 record()
简单地增加计数器,当计数器对 unit
取模等于 0
时,将输出日志消息。 record_with(Fn() -> impl Display)
接受一个函数,该函数输出任何实现了Display的任何内容,并将附加到日志消息中。
如何使用此库
添加到您的依赖项中
cargo add proglog
用法
请参阅 rayon 示例。
use proglog::ProgLogBuilder;
// Note a `log` backend needs to be globally initialized first
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
let logger = ProgLogBuilder::new().build();
for i in 0..10_000 {
logger.record_with(|| format!("Logged item: {}", i));
}
// The logger will flush when it is dropped, writing a final progress message no mater the count.
// Alternatively you can call .flush() or .flush_with().
需要注意的事项
如果 unit
太小,且你的循环太紧密,这将输出很多日志消息,这将像任何日志一样在热循环中减慢你的程序速度。如果 unit
足够大,这应该可以安全地放在热循环中,因为它所做的只是增加一个原子 u64
的更新。
如果您的循环紧凑,unit
就很小,并且您正在使用rayon或多线程更新日志信息,那么日志信息可能最终会顺序混乱。提交日志信息到记录器的顺序没有保证。因此,线程A可能会首先遇到第一个unit
的断点,而线程B可能会同时遇到第二个点,但是线程B会先提交其日志信息。拥有足够大的unit
可以减轻这种情况,但您不应该依赖于这里的日志输出顺序。所做出的权衡是为了增加速度,因此可以将此放入热点循环中,而不是保证输出顺序。
特性
pretty_counts
pretty_counts
特性打开了对日志消息中数字进行格式化的功能。将ProgLogBuilder::count_formatter
设置为CountFormatterKind
之一,数字将相应地格式化。例如,使用CountFormatterKind::Underscore
,将100000000
格式化为100_000_000
。
测试
cargo test
直接灵感
依赖项
~93KB