質問

私は、数千のプロセス(コンパイル、リンクなど)を起動するビルドツールに取り組んでいます。また、実行可能ファイルをリモートマシンに配布して、ビルドを何百台ものスレーブマシンで実行できるようにします。ビルドプロセスの子プロセスを監視するDLLインジェクションを実装しているので、期待どおりのリソースを開いた/閉じたことがわかります。そうすれば、ユーザーが依存関係情報を正しく指定していないかどうかを確認できます。

私の質問:

DLLインジェクションは動作しますが、Windowsプログラミングに精通しているわけではありません。子が生成する何百万ものすべてのファイルioレポートを使用して、親ビルドプロセスにコールバックする最良/最速の方法は何ですか?非ブロッキングソケットに書き込むように考えましたが、パイプ/共有メモリまたはCOMの方が良いのではないかと考えていましたか?

役に立ちましたか?

解決

まず、1台のマシン内だけでなく、明らかにマシン間の通信を処理しているため、共有メモリをすぐに除外します。

データの送信速度を心配するのではなく、データ量を最小限に抑えることは難しいと思います。何百万ものファイルI / Oレポートを送信する代わりに、数キロバイトのそのデータ(またはその順序の何か)をまとめて、そのパケットのハッシュを送信します。パケットサイズを慎重に選択することで、最速のものを選択するのではなく、最も便利な方法を使用できるようになるまで、データ転送を削減できるはずです。

他のヒント

Windowsの世界に留まる場合(マシンはどれもlinuxなどではありません)、名前付きパイプは高速でマシンの境界を越えてアクセスできるため、良い選択です。共有メモリはマシンの境界を越えることができないため、競合していないと思います。分散comではIDLでコントラクトを定式化できますが、パイプを介したXMLメッセージでも問題ないと思います。 xmlメッセージには、チャネルから完全に独立して動作するという利点があります。後でLinuxが必要な場合は、tcp / ipトランスポートに切り替えて、xmlメッセージを送信できます。

制限のある追加のテクニック:

もう1つ忘れられているがホットな候補はRPC(リモートプロシージャコール)です。多くのWindowsサービスはこれに依存しています。しかし、RPCをプログラムするのは難しいと思います

同じマシン上でステータス情報を送信する必要がある場合、RegisterWindowMessage()を介してWindowsメッセージを登録し、SendMessage()を使用してメッセージを送信できます

トーマスからのすべての提案とは別に、一般的なデータベースを使用して結果を保存することもできます。それが遅すぎる場合は、最新の(かつ高速な)キー/値データベース(tokyo cabinet / memcachedb / etcなど)のいずれかを使用します。

これは、ビルドで使用されるファイルを検証するタスクにとってはやり過ぎのように聞こえます。ビルドファイルをスキャンするだけですか?またはビルドツールからの出力をキャプチャしますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top