タグ付けされた質問 「threadpool」

9
インターフェイスがタスクを返さなければならない場合、操作なしの実装を行うための最良の方法は何ですか?
以下のコードでは、インターフェースのため、クラスLazyBarはそのメソッドからタスクを返す必要があります(引数のために変更することはできません)。もしLazyBarそれが迅速かつ同期的に実行するために起こるものでの実装は珍しいです-メソッドから無操作のタスクを返すための最良の方法は何ですか? 私はTask.Delay(0)以下に行きましたが、関数がたくさん呼び出された場合(引数のために、毎秒数百回と言う)、これがパフォーマンスの副作用を持っているかどうか知りたいです: この構文糖は何か大きなものに巻き戻されますか? アプリケーションのスレッドプールが詰まり始めますか? コンパイラクリーバーはDelay(0)別の方法で処理するのに十分ですか? うreturn Task.Run(() => { });任意の異なること? もっと良い方法はありますか? using System.Threading.Tasks; namespace MyAsyncTest { internal interface IFooFace { Task WillBeLongRunningAsyncInTheMajorityOfImplementations(); } /// <summary> /// An implementation, that unlike most cases, will not have a long-running /// operation in 'WillBeLongRunningAsyncInTheMajorityOfImplementations' /// </summary> internal class LazyBar : IFooFace { #region …

12
スレッドの数は多すぎますか?
私はサーバーを書いていて、リクエストを受け取ったときにそれぞれのアクションを別々のスレッドに送ります。ほとんどすべてのリクエストがデータベースクエリを作成するため、これを行います。私はスレッドプールライブラリを使用して、スレッドの構築/破棄を削減しています。 私の質問は次のとおりです。これらのようなI / Oスレッドの適切なカットオフポイントは何ですか?おおよその概算であることは知っていますが、何百もの話をしていますか?何千? このカットオフがどうなるかを理解するにはどうすればよいですか? 編集: 回答ありがとうございます。スレッド数の上限を調べるためにテストする必要があるようです。しかし、問題は、私がその上限に達したことをどのようにして知ることができるかです。正確に何を測定すべきですか?

17
ExecutorServiceのスレッドとスレッドプールの命名
そのExecutorようなフレームワークを利用するアプリケーションがあるとしましょう Executors.newSingleThreadExecutor().submit(new Runnable(){ @Override public void run(){ // do stuff } } このアプリケーションをデバッガーで実行すると、次の(デフォルト)名でスレッドが作成されますThread[pool-1-thread-1]。ご覧のとおり、これはそれほど有用ではなく、私が知る限り、Executorフレームワークは作成されたスレッドまたはスレッドプールに名前を付ける簡単な方法を提供していません。 では、どのようにしてスレッド/スレッドプールの名前を提供するのでしょうか?例えば、Thread[FooPool-FooThread]。

14
ExecutorService、すべてのタスクが完了するまで待機する方法
すべてのタスクがExecutorService完了するのを待つ最も簡単な方法は何ですか?私のタスクは主に計算なので、コアごとに1つずつ、多数のジョブを実行したいだけです。現在、私のセットアップは次のようになります。 ExecutorService es = Executors.newFixedThreadPool(2); for (DataTable singleTable : uniquePhrases) { es.execute(new ComputeDTask(singleTable)); } try{ es.wait(); } catch (InterruptedException e){ e.printStackTrace(); } ComputeDTask実行可能を実装します。これはタスクを正しく実行するように見えますが、コードはでクラッシュwait()しIllegalMonitorStateExceptionます。これは奇妙です。私がおもちゃの例をいじってみたところ、動作するように見えました。 uniquePhrases数万の要素が含まれています。別の方法を使用する必要がありますか?できるだけシンプルなものを探しています

11
スレッドとThreadPool
新しいスレッドの使用とスレッドプールのスレッドの使用の違いは何ですか?パフォーマンス上の利点は何ですか。また、明示的に作成したスレッドではなく、プールのスレッドの使用を検討する必要があるのはなぜですか。ここでは特に.NETについて考えていますが、一般的な例は問題ありません。

6
スレッドプールからスレッドIDを取得する方法
タスクを送信する固定スレッドプールがあります(5スレッドに制限されています)。これらの5つのスレッドの1つが私のタスクを実行していることをどのように確認できますか(「5番目のスレッド#3がこのタスクを実行している」など)。 ExecutorService taskExecutor = Executors.newFixedThreadPool(5); //in infinite loop: taskExecutor.execute(new MyTask()); .... private class MyTask implements Runnable { public void run() { logger.debug("Thread # XXX is doing this task");//how to get thread id? } }

10
C ++ 11でのスレッドプーリング
関連する質問: C ++ 11について: C ++ 11:std :: thread pooled? C ++ 11のasync(launch :: async)は、高価なスレッドの作成を回避するためにスレッドプールを廃止しますか? ブーストについて: スレッドを再利用するC ++ブーストスレッド boost :: threadとそれらのプールの作成! タスクを何度も作成したり削除したりせずに、タスクをに送信するスレッドのプールを取得するにはどうすればよいですか?これは、結合せずに再同期する永続的なスレッドを意味します。 次のようなコードがあります。 namespace { std::vector<std::thread> workers; int total = 4; int arr[4] = {0}; void each_thread_does(int i) { arr[i] += 2; } } int main(int argc, char *argv[]) { …

15
C#でスレッドプールを使用する場合 [閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 2年前休業。 この質問を改善する 私はC#でマルチスレッドプログラミングを学習しようとしていますが、自分のスレッドを作成するのではなく、スレッドプールを使用するのが最適な場合について混乱しています。1つの本では、小さなタスクのみにスレッドプールを使用することをお勧めします(それが何であれ)。しかし、実際のガイドラインを見つけることができないようです。このプログラミングを決定するときに使用する考慮事項は何ですか?

1
C ++ 11のasync(launch :: async)は、高価なスレッドの作成を回避するためにスレッドプールを廃止しますか?
それはこの質問に緩く関連しています:std :: threadはC ++ 11にプールされていますか?。質問は異なりますが、意図は同じです。 質問1:高価なスレッドの作成を回避するために、独自の(またはサードパーティのライブラリ)スレッドプールを使用することはまだ意味がありますか? 他の質問の結論は、std::threadプールに依存することはできないということでした(そうでない場合もあります)。ただし、std::async(launch::async)プールされる可能性ははるかに高いようです。 それは標準によって強制されているとは思わないが、私見では、スレッドの作成が遅い場合は、すべての優れたC ++ 11実装がスレッドプーリングを使用すると予想します。新しいスレッドを作成するのが安価なプラットフォームでのみ、私は彼らが常に新しいスレッドを生成することを期待します。 質問2:これは私が考えていることですが、それを証明する事実はありません。私はよく間違えられるかもしれません。それは教育を受けた推測ですか? 最後に、ここでは、スレッドの作成が次のように表現できると私が考える方法を最初に示すサンプルコードをいくつか提供しましたasync(launch::async)。 例1: thread t([]{ f(); }); // ... t.join(); なる auto future = async(launch::async, []{ f(); }); // ... future.wait(); 例2:スレッドを起動して忘れる thread([]{ f(); }).detach(); なる // a bit clumsy... auto dummy = async(launch::async, []{ f(); }); // ... but …

11
トラフィックの多いシナリオでのASP.NETでのThreadPool.QueueUserWorkItemの使用
ASP.NETでも、短期間のバックグラウンドタスク(クリティカルでないとしましょう)にThreadPoolを使用することがベストプラクティスであると常に考えていましたが、そうでない場合はこの記事に出くわしました。引数は、ASP.NET関連の要求を処理するためにThreadPoolを残すべきであるということです。 これが、これまでに小さな非同期タスクを実行してきた方法です。 ThreadPool.QueueUserWorkItem(s => PostLog(logEvent)) そして、記事は代わりに明示的にスレッドを作成することを提案しています: new Thread(() => PostLog(logEvent)){ IsBackground = true }.Start() 最初の方法には管理と制限があるという利点がありますが、バックグラウンドタスクがASP.NETリクエストハンドラーを使用してスレッドを争っている可能性があります(記事が正しい場合)。2番目のメソッドはThreadPoolを解放しますが、制限がなくなるため、リソースを使いすぎる可能性があります。 だから私の質問は、記事のアドバイスは正しいですか? サイトのトラフィックが多すぎてThreadPoolがいっぱいになっている場合は、帯域外に移行することをお勧めします。または、完全なThreadPoolはとにかくリソースの制限に達していることを意味します。独自のスレッドを開始しようとすべきではありませんか? 明確化:私は、別のプロセスを必要とする高価な作業項目ではなく、重要ではない小さな非同期タスク(たとえば、リモートロギング)の範囲で質問しているだけです(この場合、より堅牢なソリューションが必要になることに同意します)。

3
FixedThreadPoolとCachedThreadPool:2つの悪の小さい方
たくさんのタスクを実行するスレッド(約5〜150)を生成するプログラムがあります。もともと、私が使用しFixedThreadPoolているため、この類似した質問は、彼らがより良い、より長い寿命のタスクに適した提案とマルチスレッドの私の非常に限られた知識で、私は、スレッド(数分)の平均寿命は「とみなさ長く住んでいました」。 ただし、最近、追加のスレッドを生成する機能を追加しました。これにより、設定したスレッド制限を超えてしまいます。この場合、許可できるスレッドの数を推測して増やすか、スレッドをCachedThreadPool無駄にしないように切り替える方が良いでしょうか? 両方試してみて、違いはないようですのでCachedThreadPool、ムダを避けるためだけに行きたいと思います。ただし、スレッドの寿命は、代わりにを選択FixedThreadPoolして未使用のスレッドを処理する必要があることを意味しますか?この質問では、これらの余分なスレッドが無駄になっていないように見えますが、明確にしていただければ幸いです。

7
Java:特定のキューサイズの後に送信をブロックするExecutorService
単一のスレッドが並行して実行できるI / O集約型タスクを生成するソリューションをコーディングしようとしています。各タスクには、重要なメモリ内データがあります。そのため、現在保留中のタスクの数を制限できるようにしたいと思います。 このようにThreadPoolExecutorを作成すると、次のようになります。 ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(maxQueue)); 次に、キューがいっぱいになり、すべてのスレッドがすでにビジー状態になるとexecutor.submit(callable)スローさRejectedExecutionExceptionれます。 executor.submit(callable)キューがいっぱいですべてのスレッドがビジーのときにブロックを作成するにはどうすればよいですか? 編集:私はこれを試しました: executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); そして、それは私が達成したい効果をいくらか達成しますが、エレガントではありません(基本的に拒否されたスレッドは呼び出しスレッドで実行されるため、呼び出しスレッドがそれ以上送信するのをブロックします)。 編集:(質問をしてから5年後) この質問とその回答を読んでいる人には、受け入れられた回答を1つの正しい解決策と見なさないでください。すべての回答とコメントをお読みください。


2
非同期コード、シェア変数、スレッドプールスレッド、スレッドセーフ
async / awaitを使用して非同期コードを作成するとき、通常ConfigureAwait(false)はコンテキストのキャプチャを回避するために、コードがスレッドプールスレッドから次のスレッドプールスレッドにジャンプしていawaitます。これにより、スレッドの安全性に関する懸念が生じます。このコードは安全ですか? static async Task Main() { int count = 0; for (int i = 0; i < 1_000_000; i++) { Interlocked.Increment(ref count); await Task.Yield(); } Console.WriteLine(count == 1_000_000 ? "OK" : "Error"); } 変数iは保護されておらず、複数のスレッドプールスレッド*によってアクセスされます。アクセスのパターンは非並行ですが、理論的には各スレッドがローカルにキャッシュされた値をインクリメントiして、1,000,000回を超える反復が可能になるはずです。しかし、実際にはこのシナリオを作成することはできません。上記のコードは、私のマシンでは常にOKを印刷します。これは、コードがスレッドセーフであることを意味しますか?またはi、lock?を使用して変数へのアクセスを同期する必要があります。 (*私のテストによれば、スレッドの切り替えは平均して2回の反復ごとに発生します)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.