問題タブ [threadpool]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Parallel.For を使用して SQL クエリをテストし、ThreadPool と比較する
高い並列負荷の下で実行するときにパフォーマンスが必要な SQL (ADO.NET を使用し、LINQ や PLINQ を使用することは何もない) の一部を簡単にロード テストしてベンチマークする方法を探しています。
新しい並列拡張機能 CTP を使用して、具体的にはParallel.For
/Parallel.ForEach
単純に SQL を 10,000 回程度繰り返し実行することを考えましたが、これらが最適化された目的に関するデータを見つけることができませんでした。
基本的に、データベース アクセスは本質的に I/O バウンドであるため、十分な負荷が発生しないのではないかと心配しています。パラレルかどうかは誰にもわかりません。実行中のタスクが完全に CPU バウンドでない場合、x 個のスレッド (x = CPU の数) を使用するのに十分なほどインテリジェントですか? つまり、マネージド スレッド プールと同様に動作しますか?
だったらむしろカッコイイ!
編集: @CVertex が親切に以下を参照しているように、スレッドの数を個別に設定できます。ジョブが I/O バウンドの場合、デフォルトで並列ライブラリがスレッドを追加し続けるのに十分なほどインテリジェントかどうかは誰にもわかりませんか?
c# - すべてのバックグラウンド スレッドプール スレッドが終了したときに通知される
ThreadPool で 3..10 スレッドを開始するシナリオがあります。各スレッドはそのジョブを実行し、ThreadPool に戻ります。すべてのバックグラウンド スレッドが終了したときにメイン スレッドで通知される可能性のあるオプションは何ですか?
現在、作成されたスレッドごとに変数を増やし、バックグラウンドスレッドが終了しようとしているときに変数を減らす自家製の方法を使用しています。これは問題なく機能しますが、より良いオプションがあるかどうか興味がありました。
java - 2つのExecutorServicesがスレッドプールを共有することは可能ですか?
処理するレコードのコレクションがあり、処理を並列化できるため、ExecutorServiceを作成しました( Executors #newCachedThreadPool()を使用)。個々のレコードの処理は、それ自体が並列化可能なステップで構成されているため、別のを使用したいと思いますExecutorService
。この新しいスレッドプールで同じ基になるスレッドプールを使用する簡単な方法はありますか?それも望ましいですか?ありがとう。
threadpool - カスタム スレッド プールの IOCP
私は現在、インターネットでカスタム スレッド プールの実装を探しています。IOCP を使用する実装を見つけました。それらを使用することの利点は何ですか?彼らは仕事盗みを提供していますか、それともそのようなものですか、私は本当に答えを見つけることができました...
c# - ThreadPool と GUI 待機の質問
私はスレッドが初めてで、助けが必要です。新しいレコードを挿入するのに非常に長い時間 (つまり、50 ~ 75 秒) かかるデータ入力アプリがあります。したがって、私の解決策は、ThreadPool を介して挿入ステートメントを送信し、挿入の実行中に新しいレコード ID を返す挿入中に、ユーザーがレコードのデータの入力を開始できるようにすることでした。私の問題は、その挿入から新しい ID が返される前に、ユーザーが保存を押すことができることです。
安全に保存できるときに、そのスレッドからのイベントを介してtrueに設定されるブール変数を入れてみました。それから入れました
それは悪い考えだと思います。トレッドが戻る前に保存メソッドを実行すると、スタックします。
だから私の質問は:
- これを行うより良い方法はありますか?
- ここで何が間違っていますか?
助けてくれてありがとう。
ダグ
詳細については編集してください:
非常に大きな (最大サイズに近づいている) FoxPro データベースへの挿入を実行しています。このファイルには、約 200 のフィールドとほぼ同じ数のインデックスがあります。
そして、あなたが尋ねる前に、いいえ、私がいる前にここにあったように、それの構造を変更することはできず、それを打つ大量のレガシーコードがあります。最初の問題は、新しい ID を取得するには、最初にテーブル内の max(id) を見つけてから、それをインクリメントしてチェックサムする必要があることです。これには約 45 秒かかります。次に、最初の挿入は、その新しい id と enterdate フィールドの単純な挿入です。このテーブルは DBC に入れられない/入れられないので、自動生成 ID などを除外します。
@joshua.ewer
あなたは正しいプロセスを持っています。短期的には保存ボタンを無効にするだけだと思いますが、それをキューに渡すというあなたのアイデアを検討します。確認すべき MSMQ に関する参考資料はありますか?
c# - ThreadPools を使用してオブジェクト リストを検索する
リストにこれらのコンテナー オブジェクト (コンテナーと呼びましょう) があります。これらの Container オブジェクトのそれぞれはDataItem
、リストに (または派生物) を順番に持っています。典型的なシナリオでは、ユーザーはDataItems
それぞれ 1000 から 5000 の 15 から 20 のコンテナ オブジェクトを持っています。DataMatcher
次に、さまざまなタイプの検索に使用できるオブジェクトがいくつかあります。これらはほとんど問題なく動作します (数百の単体テストがあるため) が、WPF アプリケーションを機敏で応答性の高いものにするために、ThreadPool
このタスクには を使用することにしました。したがって、Container オブジェクトで実行されるDataItemCommandRunnerがあり、基本的に、リスト内の各デリゲートを、それぞれのパラメーターとしてDataItem
順番に実行します。私はThreadPool
コンテナごとに 1 つのスレッドをキューに入れることで、マルチコア コンピュータなどで理論上の検索が可能な限り効率的になるようにします。
これは基本的に、次のようなDataItemUpdaterクラスで行われます。
( RunCommandsOnContainerの役に立たないオブジェクト パラメーターは、スレッドを使用して、またはスレッドを使用せずにこれを実験しているためであり、そのうちの 1 つにはパラメーターが必要です。また、優先度をAboveNormalに設定することも単なる実験です。)
これは、検索対象のすべての単語を含むオブジェクトをAllWordsMatcher
検索するオブジェクト タイプを使用する場合DataItem
(任意の単語、正確なフレーズ、または正規表現とは対照的に)、1 つのシナリオを除くすべてのシナリオで正常に機能します。
somestring.Contains(eachWord)
これは、単体テストに裏打ちされた非常に単純なベースのオブジェクトです。しかし、ここには毛むくじゃらの奇妙さがあります。
RunCommandsOnContainerがスレッドを使用して実行さThreadPool
れると、非常識な結果が返されます。次のような文字列があるとします。
そして、私はこれを実行します:
実行すると、実際にはかなり多くの場合 true が返されます。空の文字列や、単にデータを含まないその他の文字列に対して true が返されることを示すデバッグ情報があります。また、検索対象のデータが文字列に実際に含まれている場合でも、false が返されることがあります。
このすべてのキッカー?ThreadPool
自分のコードではなくを疑うのはなぜですか?
メイン スレッドで各コンテナに対してRunCommandsOnContainer()コマンドを実行すると(つまり、UI とすべてをロックする)、毎回 100% 正しく機能します。見つけてはいけないものを見つけたり、見つけたはずのものをスキップしたりすることはありません。
ただし、 を使用するとすぐに、本来あるべきではないアイテムがたくさんThreadPool
見つかり始めますが、あるべきアイテムが見つからないこともあります。
私はこれが複雑な問題であることを理解しています (デバッグしようとするのは苦痛です、それは確かです!)、しかし、なぜこれを修正する方法についての洞察は大歓迎です!
ありがとう!
ルーン
c# - ThreadPool WorkItem の完了/完了待ちの検出
なんらかの理由で、は作業項目に やその他ThreadPool
のハンドルをQueueWorkItem
返さないためIAsyncResult
、作業が完了するまで待機することができます。メソッドはありRegisterWait...
ますが、a を渡す必要がWaitHandle
あり、それらの作成にはコストがかかります (ドキュメントを参照してください。要求さIAsyncResult
れるまで a の作成を遅らせることをお勧めします)。WaitHandle
Task Parallel Library はこの不足を修正しますが、それが利用可能になるまでには長い時間がかかります。では、この設計に問題はありますか。
編集: ThreadPool の代わりに非同期デリゲートを使用するときに発生する懸念について、フォローアップの質問をしました。
c# - C# での単純なスレッド プールのコード
単純なスレッド プール実装のサンプル コード (C#) を探しています。
codeproject で 1 つ見つけましたが、コードベースが巨大で、そのすべての機能は必要ありません。
とにかく、これは教育目的のためのものです。
c# - C#、IAsyncResult、およびスレッド プール
メソッドを使用しますAction<object>.BeginInvoke()
が、これはスレッドプールを使用しますか?
次の C# コードがあります。
スレッドプールは舞台裏で使用されていますか? または、システムは通常のスレッドを作成しますか?
c# - C# スレッド プール制限スレッド
わかりました...私はサイトを公正に検索し、このトピックに関する多くの投稿を読みました. 私はこの質問を見つけました: C# の単純なスレッド プールのコードは特に役に立ちます。
ただし、いつものように、必要なものは少し異なります。
私は MSDN の例を調べて、それを私のニーズに合わせて調整しました。私が参照する例はここにあります: http://msdn.microsoft.com/en-us/library/3dasc8as(VS.80,printer).aspx
私の問題はこれです。HttpWebRequest
とWebResponse
クラスを介して Web ページをロードし、 を介して結果を読み取るかなり単純なコード セットがありますStream
。このメソッドは何度も実行する必要があるため、スレッドで起動します。メソッド自体はかなり短いですが、(毎回さまざまなデータで) 起動する必要がある回数はさまざまです。1 から 200 までの任意の値を指定できます。
私が読んだものはすべて、ThreadPool
クラスが最有力候補であることを示しているようです。これがトリッキーになるものです。これを 100 回実行する必要があるかもしれませんが、(この特定のタスクの場合) 実行できるスレッドは最大で 3 つだけです。
ビアに設定してみましMaxThreads
た:ThreadPool
私は、このアプローチが機能していると完全に確信しているわけではありません。さらに、これが実行されるシステムで実行されている他の Web サイトやプログラムを破壊したくありません。上のスレッドの数を制限することでThreadPool
、これが自分のコードと自分のスレッドのみに関連していると確信できますか?
MSDN の例では、イベント ドライブのアプローチと呼び出しWaitHandle.WaitAll(doneEvents);
を使用しています。これが私が行っている方法です。
したがって、私の質問の核心は、コードで実行できるスレッドの最大数をどのように保証または指定するのですか?ただし、前のスレッドが任意の時点まで終了するときに、コードはより多くのスレッドを実行し続けますか? 私はこれに正しい方法で取り組んでいますか?
心から、
ジェイソン
さて、セマフォ アプローチを追加し、ThreadPool
コードを完全に削除しました。それは十分に単純に思えます。http://www.albahari.com/threading/part2.aspxから情報を入手しました。
方法を示したのは次の例です。
[以下のテキストは、サイトからのコピー/貼り付けです]
容量が 1のは、またはにSemaphore
似ていますが、には「所有者」がなく、スレッドに依存しません。どのスレッドでも を呼び出すことができますが、と を使用すると、リソースを取得したスレッドだけがリソースを解放できます。Mutex
lock
Semaphore
Release
Semaphore
Mutex
lock
次の例では、10 個のスレッドがループを実行Sleep
し、途中にステートメントがあります。Aは、一度にSemaphore
そのステートメントを実行できるスレッドが 3 つまでであることを保証します。Sleep