Prodashで並行アプリケーションの進捗状況を可視化: ターミナルUIと多様なレンダリングオプション
並行アプリケーションの進捗状況を把握するのは難しいものです。prodash
を使うと、進捗状況のレポートを簡単に統合し、さまざまな方法で表示できます。実用的なAPIで簡単に統合でき、デフォルトでターミナルUIが付属しています。
Prodashの始め方
https://docs.rs/prodash のドキュメントには、使い始めるための様々な例が掲載されています。 または、cd prodash && cargo run --all-features --example dashboard
のようにデモアプリケーションを実行してください。
Prodashの機能と特徴
Prodashはニーズに合わせて調整できる様々なCargo機能が付属しています。
進捗ツリーの管理
- progress-tree (デフォルト):
dashmap
によって裏打ちされたrender-line
およびrender-tui
で使用するためのProgress
およびRoot
トレイトの実装を提供します。 - progress-tree-hp-hashmap: 超大量の挿入および削除の場合に、pregtreeノード用の高性能レジストリです。
ロギング機能
- progress-tree-log (デフォルト):
log
クレートでロギングが初期化されると、tree::Item::message(…)とその仲間たちに提供されるすべてのメッセージを出力するためにログが使用されます。 実際の進捗状況は書き込まれません。render-tui
またはrender-line
、あるいはコンソールに出力するレンダラーと干渉する可能性があります。 - progress-log: メッセージと進捗状況を
log
クレートを使用してログに記録するProgress
実装です。
時刻表示
- local-time: 設定すると、
render-tui
のメッセージペインのタイムスタンプは、UTCではなくローカル時間を使用します。 設定すると、render-line
のログメッセージのタイムスタンプは、UTCではなくローカル時間を使用します。 それぞれrender-tui
またはrender-line
がない場合は効果がありません。
レンダリングオプション
- render-line: 進捗状況の階層のサブセットに制限できる、最小限の行ベースの進捗レンダラーを提供します。
render-tui
のようですが、依存関係がはるかに少なく、視覚的な忠実度が低くなっています。必要なのは、カーソルを少し動かしながら文字とブロックグラフィックを描画することだけです。 clicolors仕様とno-color仕様のサポート。 必要な場合にのみ進捗状況を表示し、自動的にログメッセージに影響を与えない初期遅延をサポートします。 これが機能するには、次の追加フィーチャフラグのいずれかを設定する必要があります。- render-line-crossterm: crosstermバックエンドを使用します。Windowsでの作業に役立ちます。
- render-line-termion: termionバックエンドを使用します。リーンなunix専用ビルドに役立ちます。
- render-line-autoconfigure: 有効にすると、render::line::Options::auto_configure()への呼び出しは、ターミナルにいるかどうかに基づいてディスプレイを構成し、可能なものまたは必要なものに基づいてカラーモードを設定します。
- signal-hook: 設定されており、hide_cursor行レンダラーオプションが設定されている場合、カーソルは非表示になり、SIG_INTおよびSIG_TERMハンドラーがインストールされて、終了時にカーソルがリセットされます。 それ以外の場合は、返されたJoinHandleでshutdown_and_wait()を呼び出して、レンダラーがターミナルの変更を元に戻すことができるようにする必要があります。 そうしないと、プログラムが既に終了すると、カーソルが非表示のままになります。 追加のスレッドと追加の依存関係が発生します。
- render-tui: 現在の進捗状況のすべての詳細を視覚化するターミナルユーザーインターフェースを提供します。 ターミナルをマトリックスディスプレイとして扱います。 これが機能するには、次の追加フィーチャフラグのいずれかを設定する必要があります。
- render-tui-crossterm: ターミナルバックエンドとしてcrosstermクレートを使用します。 すべての場所でネイティブに動作しますが、依存関係が多くなっています。
cargo build --features render-tui-crossterm,crossterm/event-stream
のように、追加の機能を設定できます。 - render-tui-termion: ターミナルバックエンドとしてtermionクレートを使用します。 依存関係は少なくなりますが、unixシステムでのみ動作します. これを取得するには、デフォルトの機能を無効にし、少なくともrender-tuiとrender-tui-termionを選択します。
- render-tui-crossterm: ターミナルバックエンドとしてcrosstermクレートを使用します。 すべての場所でネイティブに動作しますが、依存関係が多くなっています。
ユニットとUIオプション
- unit-bytes: 小さなbytesizeクレートを使用して、動的なバイト表示をサポートします。
- unit-human: 小さなhuman_formatクレートを使用して、人間が把握しやすい方法でカウントを表示します。
- unit-duration: jiffクレートのフレンドリーな期間形式を使用して、「5m4s」のように秒単位で時間を表示します。
- 高速な挿入と更新により、高度に並行なプログラムの透過的な進捗状況の追跡が可能です。
- 成功と失敗に関する情報のためのメッセージバッファー。
- キーボードコントロールと動的なサイズ変更を備えた視覚化のためのターミナルユーザーインターフェース。
- unicodeおよびマルチ幅文字のサポート。
Prodashの制限事項
- 行レンダラーは、視覚的なアーティファクトなしで表示できる進捗状況の量に本質的に制限があります。
- 進捗状況の情報とメッセージを表示するたびに、かなりの量の状態をコピーします。
- 基盤となる同期データ構造であるdashmapは、unsafeのすべての使用を文書化していません。
- 2^16を超えるタスクがツリーの単一レベルで同時に実行されている場合、それらは互いに上書きを開始します。 一緒に実行されていなくても、そのライフタイムを超えると、新しいタスクは最終的に古いタスクのように見えます(そのIDがラップアラウンドしました)。
- ドロップ時に、新しいIDを生成するために使用される子カウントは減少しません。
改善策として、IDをu32のように大きくします。 パフォーマンステストが行われたら、そうする必要があります。
Prodashの使用における教訓
drop()
は、futureがReady
を返し、futures::executor::ThreadPool
にある場合に呼び出されることは保証されていません。
回避策としては、明示的にドロップしてクリーンアップします(忘れやすい)。 これが、futures::future::abortable()
が(ポーリングを停止することで)機能する理由でもありますが、クリーンアップが実行されないため機能しません。
改善策として、ジョインハンドルを使用して待機します。これにより、フューチャーが適切にドロップされます。 select()
は複雑なフューチャーでは機能しない場合があります。この場合、Unpin
が実装されていない場合はboxed()
にする必要があります。
prodash
を活用して、並行処理におけるアプリケーションの進捗管理を効率化し、ターミナルUIで直感的にモニタリングしましょう。 다양한 렌더링 옵션과 함께 사용할 수 있습니다. prodash
を使用することで、ユーザー体験を向上させることができます。