【每周一库】prodash – 用来显示并发应用程序进度的仪表板

在控制台应用程序中,如果通过自己的实现能够向用户展示程序的进程是一件繁琐的事。同时高并发程序的开发也是系统编程语言中很重要的环节,对高并发程序进行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 实例