問題タブ [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# - シングル スレッド アプリをマルチスレッド、並列実行、モンテカルロ シミュレーションに移行する
私は、既存のシングル スレッド モンテカルロ シミュレーションを使用して最適化する任務を負っています。これは ac# コンソール アプリです。db アクセスはありません。データは csv ファイルから 1 回読み込まれ、最後に書き出されます。そのため、ほとんど CPU バウンドであり、約 50 MB のメモリしか使用しません。
Jetbrains dotTrace プロファイラーで実行しました。合計実行時間の約 30% が一様乱数の生成であり、24% が一様乱数から正規分布乱数への変換です。
基本的なアルゴリズムは、多数のネストされた for ループであり、中心に乱数呼び出しと行列乗算があり、各反復は double を返し、結果リストに追加されます。このリストは定期的にソートされ、いくつかの収束基準についてテストされます (チェック時)。総反復回数の 5% ごとにポイントします) 許容できる場合、プログラムはループから抜け出し、結果を書き込みます。そうでない場合は、最後に進みます。
開発者に検討してもらいたい:
- 新しい Thread v ThreadPoolを使用する必要がありますか
- Microsoft Parallels Extension ライブラリを確認する必要があります
- AForge.Net Parallel.For、http://code.google.com/p/aforge/他のライブラリを見る必要がありますか?
並列コードやマルチスレッド コードを書いたことがないので、上記のチュートリアルへのリンクは大歓迎です。
- 大量の正規分布乱数を生成し、それらを消費するための最良の戦略。一様乱数は、アプリによってこの状態で使用されることはなく、常に正規分布に変換されてから消費されます。
- 乱数生成のための優れた高速ライブラリ (並列?)
- このパラレルを使用する際のメモリの考慮事項、必要な追加の量。
現在のアプリは 500,000 回の反復に 2 時間かかります。ビジネスではこれを 3,000,000 回の反復にスケーリングし、1 日に複数回呼び出す必要があるため、かなりの最適化が必要です。
特に、Microsoft Parallels ExtensionまたはAForge.Net Parallelを使用したことのある方からのご意見をお待ちしております
これはかなり迅速に製品化する必要があるため、.net 4 ベータ版は公開されていますが、同時実行ライブラリが組み込まれていることはわかっています。.net 4 がリリースされたら、後でトラックに移行することを検討できます。今のところ、サーバーには .Net 2 があり、私の開発ボックスにある .net 3.5 SP1 へのアップグレードを審査のために提出しました。
ありがとう
アップデート
Parallel.For の実装を試してみましたが、奇妙な結果が得られました。シングルスレッド:
に:
Simulate 内で rnd.nextUniform() への呼び出しが多数あります。同じ値を多数取得していると思いますが、これは現在並列になっているため発生する可能性がありますか?
また、List AddRange 呼び出しがスレッド セーフではないという問題もありますか? 私はこれを見る
System.Threading.Collections.BlockingCollection は使用する価値があるかもしれませんが、AddRange のない Add メソッドしかないため、その結果を調べて、スレッド セーフな方法で追加する必要があります。Parallel.For を使用したことのある方からの洞察をお待ちしております。Mersenne Twister の実装で nextUniform を呼び出すときに例外が発生したため、一時的にSystem.Randomに切り替えました。おそらく、特定の配列が範囲外のインデックスを取得していたため、スレッドセーフではありませんでした....
networking - ネットワークにバインドされたタスクのスレッド プールのサイズ設定
次のようなタスクを含むスレッド プールのサイズを決定するための基本的な規則は何ですか。
- 常にネットワークにバインドされています。
- 異なるスループットとレイテンシで外部サービスにアクセスします。
私の主な関心事は、帯域幅を最適に使用することです (つまり、タスクを連続して処理しないでください。ただし、1200 のネットワーク接続も開かないでください)。
c# - Javaでのアダプティブスレッドプールの設計上の考慮事項
Javaでスレッドプールを実装したいと思います。これは、送信されたタスクの計算およびI/O動作に基づいて動的にサイズを変更できます。
実際には、C#4.0の新しいスレッドプールの実装と同じ動作を実現したいと思います。
すでに実装されていますか、それともほとんど既存の同時実行ユーティリティ(CachedThreadPoolなど)を使用してこの動作を実現できますか?
C#バージョンは、最適な使用率を実現するために自己計測を行います。Javaで利用できるセルフインストルメンテーションと、現在のパフォーマンスへの影響は何ですか?
タスクがその意図を示す協調的なアプローチを実行することは可能ですか(たとえば、I / O集中型の操作に入る、CPU集中型の操作フェーズに入る)?
どんな提案でも大歓迎です。
コメントに基づいて編集:
ターゲットシナリオは次のとおりです。
- ローカルファイルのクロールと処理
- Webクロール
- マルチWebサービスへのアクセスと集約
CachedThreadPoolの問題は、既存のすべてのスレッドがブロックされたときに新しいスレッドを開始することです。明示的な境界を設定する必要がありますが、それだけです。
たとえば、100個のWebサービスを連続してアクセスできます。100 CTPを作成すると、100スレッドが開始されて操作が実行され、大量の複数のI/O要求とデータ転送が確実にお互いにつまずきます。静的テストケースの場合、最適なプールサイズを実験して見つけることができますが、ある方法で適応的に決定して適用する必要があります。
c# - ThreadPool が驚くべき結果をもたらしました。(いいえ、私はしませんでした)
マルチスレッドや のパワーを高く評価していないというわけではありませんがThreadPool、比較的単純なThreadPool. だから私はここに私のコードを提出して、私よりもはるかに賢い人々に分解してもらいます。
ここで何か間違ったことをしているのですか、それともこれまで期待していたよりもはるかに優れたマルチスレッドの候補ですか? (はい、この関数はスレッド全体です。先ほど言ったように、実行に 1 分以上かかっていました)
編集:私自身の質問に答えるには、いいえ、これは壊れています:複数回実行されているようですが、同じトリガーで実行されています。これは、ラムダの処理方法によるものですか?
.net - .Net2.0およびSQLServer2008のハングプロセス
非常に単純なクエリを実行する単純な.NetWebサービスを作成しました(通常は非常に高速であるはずです)。クエリは次のようなものです。
V_ActiveDirは、ActiveDirectoryデータのビューです。このクエリは、基本的に、レポートの電子メール送信先となる電子メールアドレスのリストを取得します。私のレポートテーブルには現在3つのレコードしかありません。レポートテーブルにフィールドを追加しようとしましたが、それは永遠にかかりました。そのため、このクエリがSQLプロセスでハングしていることがわかりました。その日の早い段階で、このスクリプトは次のエラーを生成しました。
...これが吊り下げプロセスを説明していると思います。私たちはそれを殺そうとしましたが、今はロールバック状態にあり、SQLサーバーを再起動する必要があるかもしれません(これは、selectクエリがロールバックしようとするのは奇妙です)。これが再び発生するのを防ぐために、SQLサーバーまたは.netのいずれかを使用する方法はありますか?または、SQLでこのプロセスを削除する方法...スレッドプールに何かがぶら下がっている可能性はありますか?レポートテーブルから選択できるので、テーブルロックはありません。このテーブルを変更しようとした場合にのみ、ホイールが回転します。
IISにアクセスできないため、IISの経験はあまりありませんが、提案があればそれを伝えることができます。
編集:これは、catchステートメントで、SqlConnectionが開いているかどうか、および閉じているかどうかを確認しないために発生する可能性がありますか?
c - スレッドプールとは何ですか?
Thread-pool (pthreads の助けを借りて C で) を実装する概念は何ですか? スレッドプールから実行するようにスレッドを割り当てるにはどうすればよいですか?
delphi - Omni Thread Library のスレッド プールでメモリ使用量を制御するにはどうすればよいですか?
私はgabr の OmniThreadLibraryを使用して ThreadPool を構築しています。
私はマルチスレッドに関しては初心者なので、OTL が非常に興味深いと感じたのはそのためです。
デモ アプリケーション「app_11_ThreadPool.exe」に従って、アプリケーションにスレッド プールをセットアップします。私のアプリの目的は、URL のリストを取得し、それらに接続して、自動的に返されるファイルをダウンロードしようとすることです (ブロックできるように、潜在的なマルウェア サイトのペイロードをテストしています)。
通常、500 ~ 1000 のサイトのリストがあります。メイン フォームに URL を保持する TMemo があります。ここに私の関連コードがあります。このコードは、「Begin」ボタンのクリック イベントから実行されることに注意してください。
TSiteQuery は次のとおりです。
現在、すべてがうまく機能しています。1000 個の URL を実行すると、アプリケーションのメモリ使用量が 10 MB から最大 130 MB に増加します。それは大したことではなく、私はそれを理解しています。
しかし、問題は、「開始」をクリックするたびに、アプリのメモリ使用量が最大 130 MB 増加することです。何をしているのかわからないだけかもしれませんが、スレッドプールを使用すると、実行のたびに新しいスレッドを作成する必要がないという印象を受けました。
プール内で以前に作成されたスレッドが後続の実行で再利用されることを願っています。「開始」を1回クリックしても、その後10回クリックしても、アプリのメモリ使用量は約130 mbにとどまると予想していました。
助言がありますか?
よろしく
c# - C#:多くの接続を開始するときの非同期デリゲートとThreadPool.QueueUserWorkItem
Amazon SDB内の多数のレコードを削除するには、多くのWebサービス呼び出しを送信する必要があります(残念ながら、現在、行を削除できるのは一度に1つだけです)。
非同期WebRequestを使用しないAmazonのSDBc#ライブラリを使用しています。
現在、ThreadPool.QueueUserWorkItemを使用して一連の呼び出しをキューに入れています(一連の接続を許可するようにconnectionManagement maxconnectionを構成しました)。これはうまく機能します。要求が送信されると、ブロックされ、別の要求が行われます。
これは、この目標を達成するための間違った方法ですか?非同期デリゲートを使用してBeginInvokeとEndInvokeを実行する必要がありますか?
c# - .NET で固定サイズの ThreadPool を作成するにはどうすればよいですか?
.NET で固定の任意サイズの ThreadPool を作成したい - デフォルトのサイズが 25 であることは理解していますが、5 や 10 などの別のサイズが必要です。
asp.net - トラフィックの多いシナリオで ASP.NET で ThreadPool.QueueUserWorkItem を使用する
私は、ASP.NET であっても、存続期間の短いバックグラウンド タスク (重要ではないものとしましょう) に ThreadPool を使用することがベスト プラクティスであると常に考えていましたが、そうではないことを示唆しているように思われるこの記事に出くわしました。引数は、ASP.NET 関連の要求を処理するために ThreadPool を残す必要があるということです。
だから、これまで私が小さな非同期タスクを行ってきた方法は次のとおりです。
そして、この記事では代わりに、次のようにスレッドを明示的に作成することを提案しています。
最初の方法には、管理され制限されているという利点がありますが、(この記事が正しければ) バックグラウンド タスクが ASP.NET 要求ハンドラーを使用してスレッドを競合する可能性があります。2 番目の方法は ThreadPool を解放しますが、その代償として制限がなくなるため、多くのリソースを消費する可能性があります。
私の質問は、この記事のアドバイスは正しいですか?
サイトのトラフィックが多すぎて ThreadPool がいっぱいになった場合、帯域外に移行した方がよいでしょうか。それとも、ThreadPool がいっぱいになったということは、とにかくリソースの限界に達していることを意味します。自分のスレッドを開始しようとするべきではありませんか?
明確化: 私は、重要ではない小さな非同期タスク (リモート ロギングなど) の範囲で質問しているだけであり、別のプロセスを必要とする高価な作業項目ではありません (これらの場合、より堅牢なソリューションが必要になることに同意します)。