【每周一库】prodash – 用来显示并发应用程序进度的仪表板
- 2020 年 3 月 3 日
- 笔记
在控制台应用程序中,如果通过自己的实现能够向用户展示程序的进程是一件繁琐的事。同时高并发程序的开发也是系统编程语言中很重要的环节,对高并发程序进行debug和基准测试也是难度不低的事。
今天介绍的库可以帮助开发者高效的开发出可以在终端中显示程序运行进程的控制台应用程序,也可以帮助高并发程序开发者对程序进行debug或基准测试。
prodash
Prodash 是一个用来显示并发应用程序进度的仪表板
它由两部分组成
- 一个用来收集进程信息和其他消息的
树
- 一个
终端用户界面
,显示以上信息以及应用程序本身提供的可选自由格式信息
基准测试基本可以表明,虽然树
不是异步的,但接近透明和无阻塞的性能。
终端用户界面
应该是性能上最不透明的部分,但可以通过设置降低刷新数据的频率。
终端用户界面
默认情况下,终端用户界面
会显示所有状态。
一个终端用户界面
的实现模块,能够可视化所有存储在进程树内的信息。
请注意,它位于tui-renderer
功能切换开关的后面,默认情况下已启用。
例子
use futures::task::{LocalSpawnExt, SpawnExt}; use prodash::tui::ticker; // 获取一个进程树 let root = prodash::Tree::new(); // 配置gui,为其提供一个不断变化的树的句柄 let render_fut = prodash::tui::render( root.clone(), prodash::tui::TuiOptions { title: "minimal example".into(), ..prodash::tui::TuiOptions::default() } )?; // 由于它会一直不停运行,我们需要一种可以停止它的方法。 let (render_fut, abort_handle) = futures::future::abortable(render_fut); let pool = futures::executor::LocalPool::new(); // 将gui放入后台 let gui = pool.spawner().spawn_with_handle(async { render_fut.await.ok(); () })?; // …并运行可提供进度的任务 pool.spawner().spawn_local({ use futures::StreamExt; let mut progress = root.add_child("task"); async move { progress.init(None, Some("items")); let mut count = 0; let mut ticks = ticker(std::time::Duration::from_millis(100)); while let Some(_) = ticks.next().await { progress.set(count); count += 1; } } })?; // …完成后,停止gui abort_handle.abort(); //…然后等待运行结束 futures::executor::block_on(gui);
记录日志
如果启用了log-renderer
功能(默认),大多数对progress
的调用也将被记录下来。这样,即使没有终端用户界面,也会有进度消息。请注意,不应在启用此功能和使用终端用户界面的情况下将日志传向stdout,因为这会严重干扰TUI。
示例程序
可参考 仪表板示例.

用以下命令运行 cargo run --example dashboard
其他功能可以用以下命令查询 cargo run --example dashboard -- --help
.
模块
一个 终端用户界面 的实现模块,能够可视化所有存储在 进程树 内的信息。
宏
警告 级别记录日志信息
结构
TreeOptions |
用来配置新的 tree::Root 实例 |
---|---|
|
|