2

私は現在、優れたライブラリである.NETのメッセージベースのマルチスレッドにRetlangを使用しています。明示的なロックはもうありません。すべてのスレッドが独自のビジネスを行っており、アプリケーションの一部を管理し、メッセージを介して他のスレッドと通信しています。

ここで、独自のパブリッシャー/サブスクライバースレッドを持つことができるアプリケーションの機能を実装する必要があります。唯一の問題は、このスレッドが実際に実行する作業が非常に少ないことです。約10分ごとに発行元からメッセージを受信する予定です。メッセージを受信すると、それはいくつかの作業を行いますが、数百ミリ秒以上かかることはありません。

それで、99.9%の時間スレッドをスリープさせることが実際に良い選択であるかどうか疑問に思い始めました。この種の操作にはスレッドプールがありますが、メッセージを受信するスレッドを制御できないため、エラーが発生しやすい醜いロックを使用する必要があります。

私の質問は、スレッドをアイドル状態のままにして、大部分の時間を待つことは、リソースの面で本当に問題なのかということです。優れたメッセージベースのアーキテクチャを使用した後に共有マルチスレッドを使用すると、過去にさかのぼるような気分になります。さらに、ロックを備えたアプリケーションの唯一の部分になります。しかし、私は「ここで何か間違ったことをしているのだろうか」と考え続けています。このスレッドで。

編集:皆さん、ありがとうございました。すべての回答を読んだ後、別のスレッドはそれほど問題ではないと判断しました。私のアプリケーションは、メッセージベースのマルチスレッドのみで一貫性を保ちます。パフォーマンスに本当に問題がある場合は(ただし、そうではないはずです)、さらに調査します。

4

7 に答える 7

3

私は実際、ほとんどの時間スリープしているスレッドにThreadPoolを使用することは、設計上の選択としては不適切であると主張します。

シングルスレッドをスリープ状態にする(または、より適切には、イベントを待機する)ことで、アプリケーションのオーバーヘッドはほとんどなくなります。専用スレッドを使用する主な欠点は、スレッドに独自のスタックを割り当てる必要があるため、スレッドプールスレッドよりも少し余分なメモリを使用することです。

于 2010-06-28T19:16:04.647 に答える
2

これは、を使用する理想的なシナリオのように聞こえますTask。それらはデフォルトでスレッドプールを使用しますが、はるかに進化したAPIを備えています。

于 2010-06-28T19:15:19.997 に答える
1

これにRetlangを使用できませんPoolFiberか?のような専用スレッドではThreadFiberなく、.Netスレッドプールによってサポートされています。つまり、アイドル状態のスレッドを維持することなく、アプリケーション全体で使用しているのと同じRetlangセマンティクスを使用し続けることができます。

于 2010-06-28T19:20:50.967 に答える
1

PoolFiberの各アクションは個別のプールスレッドで実行できますが、特定のPoolFiberのアクションは、並列ではなく順次実行され、一度に1つのプールスレッドのみが実行されます。

PoolFiberはあなたが探していることをするはずです。

于 2010-07-01T03:31:15.007 に答える
0

これは基本的に最適化の問題だと思います。アプリケーションにパフォーマンスの問題(特にメモリの問題)がありますか?そうでない場合は、先に進んでスレッドをアイドル状態のままにし、コードをクリーンに保ちます。本当の理由があれば、他のオプションを検討してください。

于 2010-06-28T19:16:54.097 に答える
0

これらのメッセージを受信するための専用スレッドがあれば問題ないと思います。私はそれが好ましい方法であるとさえ言うかもしれません。それはあなたがただ意地悪なスレッドを作成しているようなものではありません。ここでは1つの余分なスレッドについて話しているので、多くのリソース(おそらく少しのスタックスペース)を消費しません。(もちろんメッセージパッシングを除いて)共有状態の追加の同期について心配する必要がないという利点は、私の意見では欠点よりも優先されます。

于 2010-06-28T19:24:07.627 に答える
0

F#の使用を検討する必要があります。これは、スレッドを焼き付けずに論理的にシングルスレッドのエージェントをプログラミングするのに最適です(たとえば、エージェントはThreadPoolについてホップできますが、シリアル化された方法でメッセージに応答し、メールボックスに到着したメッセージがそれらをウェイクアップしてThreadPoolの動作をスケジュールします)。

http://blogs.msdn.com/b/dsyme/archive/2010/02/15/async-and-parallel-design-patterns-in-f-part-3-agents.aspx

于 2010-06-28T19:25:50.720 に答える