Multithreadingグッドデザイン-ベスト実践
-
08-06-2019 - |
質問
この問題:しているプログラムはfetch(しよう)100レコードからデータベース、そしてそれぞれでは最新の情報からウェブサービスです。るには二つの方法がありますの紹介平行度このシナリオ:
私は開始の申請ごとに、webサービスの新しいThread.の数を同時にスレッド制御による外部パラメータ(または動的に調整なんだか).
作成し小さめのバッチ(たとえば10記録との打上げバッチごとに別のスレッド(社の例では、10のスレッド).
であるよりも、なぜそう思いますか?
解決
オプション3は:
利用非同期IO.
ない限りご要望の加工は複雑ですが、プログラムをお過ごし99%ので時間待ちのHTTPます。
のは、まさにこのような非同期IO用して、windowsネットワークスタックするnetフレームワークなど)の心配を待って、モーバイルコンピューティングのスレッドを派遣し、"お迎えの。
残念ながら。NETフレームワークでは、右の心の痛み-助教授くだけを使用rawソケットまたはWin32apiに含まれています。こちらはa(試!) 例C#3か:
using System.Net; // need this somewhere
// need to declare an class so we can cast our state object back out
class RequestState {
public WebRequest Request { get; set; }
}
static void Main( string[] args ) {
// stupid cast neccessary to create the request
HttpWebRequest request = WebRequest.Create( "http://www.stackoverflow.com" ) as HttpWebRequest;
request.BeginGetResponse(
/* callback to be invoked when finished */
(asyncResult) => {
// fetch the request object out of the AsyncState
var state = (RequestState)asyncResult.AsyncState;
var webResponse = state.Request.EndGetResponse( asyncResult ) as HttpWebResponse;
// there we go;
Debug.Assert( webResponse.StatusCode == HttpStatusCode.OK );
Console.WriteLine( "Got Response from server:" + webResponse.Server );
},
/* pass the request through to our callback */
new RequestState { Request = request }
);
// blah
Console.WriteLine( "Waiting for response. Press a key to quit" );
Console.ReadKey();
}
編集:
の場合です。純、"完了コールバック'を実際に取得しろThreadPoolスレッドを超えないものメインスレッド、またロック他の資源が利用されているが、それでも保存するすべてのトラブル管理スレッド)。
他のヒント
二つについての考慮が必要となります。
1.るまでにどのくらい時間が処理名前を挙げた報告書を発表した。
場合はレコード処理が非常に速く、オーバーヘッドの手渡したりレコードのスレッドができなボトルネックです。この場合、と思ったバンドルを記録できないしなくてはならないoffかるものを表しています。
が記録処理の場合、ランチタイムは行の違いを理解することが無視できるので、簡単なアプローチ(1記録一スレッドでも最高です。
2.どのように多くのスレッド画。
ばんを使用threadpoolと思いますか必要な手動で限定スレッドの数や、必要な休憩のデータを大きなチャンク.新規スレッド毎の記録を残すシステムを詰場合はレコード数を取得します。
コンピュータのプログラムはどのように変動するというのボトルネックで:覚えているのですが、HTTPプロトコルができないものを持続的なヘッダをまとめて見ることができる数の取得要求を同じソケットだからのTCP/IP手だ。残念ながらわからないという使い方。純ます。と合わせることが可能です。)
ありそうも遅れ応答にありがとうございます。きてみてくだbgmて指定された数の残高を求め、サーバーにコピーします。
を取得し 並行為.のBlockingCollection.使用するスレッドのフィードバッチ記録は、1~nのスレッドを引の記録をコレクションサービスです。をコントロールすることが出来ま率コレクションでの食事を与えられ、スレッドの数を呼webサービスうに設定できるようにしよConfigSection、それを汎用的供給の行動の代表団は、いちょっとしたbatcher再利用できるための心配は不要です。