5

標準出力にログを出力するLinuxプログラム(言語は関係ありません)があります。プロセスの監視にはログが必要です。

次に、フォークまたはスレッドを使用して並列化します。

問題: 結果の stdout には、無関係な行の読み取り不能な混合が含まれます...

そして最後に質問: 並列プロセスの出力ロジックをどのように再構築しますか?

4

4 に答える 4

3

勝手に答えてすみません…

明確な解決策は、GNU 並列ユーティリティを使用することでした。

よく知られているxargsユーティリティを置き換えるようになりましたが、コマンドを並行して実行し、出力をグループに分けます。

したがって、単純な 1 プロセス、1 スレッドのユーティリティをそのままにして、その呼び出しを次のparallelようにパイプします。

生成引数リスト | parallel < オプション > my-utility

これは、parallel のオプションに応じて、複数の呼び出しに対して適切にグループ化された出力を生成できます。my-utility

于 2012-11-14T09:53:05.343 に答える
2

マルチスレッドの場合は、stdout ログへの印刷/書き込みをミューテックスで保護する必要があります。Linux および c/c++ でこれを行う最も一般的な方法は、pthread_mutex を使用することです。さらに、C ++の場合、ブーストには使用できる同期があります。

これを実装するには、おそらくすべてのロギングを 1 つの関数またはオブジェクトにカプセル化し、ミューテックスを内部的にロックおよびロック解除する必要があります。

ロギングのブロッキング パフォーマンスが非常に高くなる場合は、ログ メッセージを (前述のオブジェクトまたは関数で) バッファリングし、バッファがいっぱいになったときにのみ stdout に書き込むことを検討できます。バッファリングにはミューテックス保護が必要ですが、バッファリングは stdout への書き込みよりも高速です。

各スレッドに独自のログ メッセージがある場合でも、stdout に書き込むために同じミューテックスを共有する必要があります。この場合、各スレッドがそれぞれのログ メッセージをバッファリングし、バッファがいっぱいになったときにのみ stdout に書き込み、stdout に書き込むためのミューテックスのみを取得するのがおそらく最適です。

于 2012-06-07T08:19:09.153 に答える
2

C++ を使用している場合は、Pantheiosまたは派生バージョンの Boost::Log を使用するか、Logging In C++ : Part 2または

別の言語を使用している場合、IO 操作の周りのファイル ロックはおそらくFile Locksを参照する方法です。セマフォンまたはその他のプロセス制御システムを使用して同じ結果を得ることができますが、私にとってはファイル ロックが最も簡単です。

この監視がシステム全体と見なされる場合は、syslogの使用を検討することもできます。

于 2012-06-07T08:38:40.847 に答える
2

私たちが使用するもう 1 つの方法は、ロギングのためにスレッド (ロガー スレッド) を委任することです。ログを記録したい他のすべてのスレッドは、それをロガー スレッドに送信します。この方法では、ログのフォーマットを 1 か所で行うことができ、構成も可能であるため、柔軟性が得られます。ロックについて心配したくない場合は、メッセージの受け渡しにソケットを使用できます。

于 2012-06-07T09:58:41.743 に答える