【每周一庫】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 實例