問題タブ [blockingcollection]
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# - BlockingCollection.TakeFromAny メソッドは、ブロッキング プライオリティ キューの構築に適していますか?
ブロッキング プライオリティ キューを構築する必要があり、それTakeFromAny
が秘密の要素である可能性があると思いますが、そのメソッドに関するドキュメントはまばらです。その目的/適切な使用は何ですか?
私の要件は、複数のスレッドが優先度の高いキューまたは優先度の低いキューに追加されることです。1 つのスレッドがこれら 2 つのキューを消費し、優先度の低いキューの前に常に優先度の高いキューから取得します。
BlockingCollection
どちらもthe メソッドも the methodも役に立たない可能性は十分にありTakeFromAny
ます。もしそうなら、正しい方向へのポインタをいただければ幸いです。
c# - BlockingCollection.GetConsumableEnumerable を使用した Parallel.ForEach ループ
を使用しているときにParallel.ForEach
ループが終了するのはなぜですか?OperationCancelledException
GetConsumableEnumerable
c# - 並行コレクションとユニーク要素
BlockingCollection
私は繰り返される要素と並行しています。個別の要素を追加または取得するためにどのように変更できますか?
c# - BlockingCollection の使用: OperationCanceledException、より良い方法はありますか?
私は (率直に言って素晴らしい)BlockingCollection<T>
型を、高度にマルチスレッド化された高性能アプリに利用しています。
コレクション全体で多くのスループットがあり、ミクロレベルでは非常に高性能です。ただし、「バッチ」ごとに、キャンセルトークンにフラグを立てることで常に終了します。これにより、待機中のTake
呼び出しで例外がスローされます。それは問題ありませんが、a) 例外には明らかなオーバーヘッドがあり、b) デバッグ時に、その特定の例外のブレークを手動でオフにしたくないため、戻り値または出力パラメーターでそれを通知することにしました。例外。
実装は複雑なようで、理論的には、例外を使用しない独自のバージョンを逆アセンブルして再作成できると思いますが、おそらくそれほど複雑ではない方法がありますか?
null
コレクションにオブジェクト (そうでない場合はプレースホルダー) を追加して、プロセスが終了する必要があることを示すこともできますが、適切に中止する手段も必要です。
では - 代替のコレクション型ですか? 私自身を再作成しますか?これを悪用する方法はありますか?
(いくつかのコンテキスト: を使用BlockingCollection<T>
して手動でロックするよりも利点があるため、使用しましたQueue
。スレッドプリミティブの使用が優れていることがわかります。私の場合、あちこちで数ミリ秒と最適なコアを使用することが重要です。 )
編集:私はちょうどこれのために報奨金を開きました. アナスタシアスヤルの答えが、私のコメントで提起した質問をカバーしているとは思いません。私はこれが難しい問題であることを知っています。誰でも支援できますか?
c#-4.0 - BlockingCollection を操作するときのコンシューマ タスクからのプロデューサー タスクのシグナリング
Producer タスクと Consumer タスクを使用してファイルを操作する非常に基本的なアプリケーションがあります。ここの例に基づいていますhttp://msdn.microsoft.com/en-us/library/dd267312.aspx
プログラムの基本は、Producer タスクがハード ドライブ上のファイルを列挙し、それらのハッシュ値を計算し、その他いくつかのことを行うことです。Producer がファイルの操作を完了すると、ファイルを Enques し、Consumer がそれを取得します。
Consumer タスクは、リモート サーバーに接続し、ファイルのアップロードを試行する必要があります。ただし、リモート サーバーに接続できないなどのエラーがコンシューマーで発生した場合は、実行中の処理を停止して終了する必要があることをプロデューサー タスクに通知する必要があります。サーバーがダウンした場合、またはダウンした場合、Producer が何千ものファイルを循環し続ける必要はありません。
BlockingCollection オブジェクトで .CompleteAdding() を使用して、Producer タスクから Consumer タスクにシグナルを送るサンプルをたくさん見てきましたが、生産を停止する必要があるというシグナルを Consumer から Producer に送信する方法がわかりません。
c# - ストリーミングデータBlockingCollection
スティーブン・トーブの本の88ページ
http://www.microsoft.com/download/en/details.aspx?id=19222
コードがあります
スティーブンはそれから言及します
「GetConsumingEnumerableをデータソースとして呼び出した結果をParallel.ForEachに渡す場合、コレクションが空になると、ループで使用されるスレッドがブロックされる可能性があります。ブロックされたスレッドは、Parallel.ForEachによって解放されない場合があります。このように、上記のコードでは、コレクションが空である期間がある場合、プロセスのスレッド数が着実に増加する可能性があります。」
なぜスレッド数が増えるのかわかりませんか?
コレクションが空の場合、blockingcollectionはそれ以上のスレッドを要求しませんか?
したがって、BlockingCollectionで使用されるスレッドの数を制限するためにWithDegreeOfParallelismを実行する必要はありません。
c# - BlockingCollection で GetConsumingEnumerable() をキャンセルする方法
次のコードでは、CancellationToken を使用して、プロデューサーが生成していないときに GetConsumingEnumerable() をウェイクアップし、foreach から抜け出してタスクを終了したいと考えています。しかし、 IsCancellationRequested がログに記録されているのが見えず、 Task.Wait(timeOut) が timeOut 期間全体を待機します。私は何を間違っていますか?
後で...
c# - .Net 4.0 における複数の生産者/消費者の相互作用
BlockingCollection を使用していくつかのファイルを処理し、サーバーにアップロードしています。
現在、ファイル システムを再帰的に処理し、特定のファイルを一時的な場所に圧縮する単一の Producer があります。ファイルの処理が完了すると、独自のオブジェクトが BlockingCollection に追加されます。このオブジェクトには、ファイル名、ファイル パス、変更日などの情報が含まれています。次に、コンシューマーはこのオブジェクトを取得し、それを使用してファイルをアップロードします。Producer は、ファイル システムの検索とファイルの操作を完了すると、BlockingCollection.CompleteAdding() メソッドを呼び出して、完了したことを Consumer に通知します。
私がやりたいことは、プロデューサーの数を 2 つ以上に増やすことです。その理由は、圧縮プロセスに時間がかかり、マルチコア プロセッサでは 1 つのコアしか利用していないためです。これにより、Producer は、より高速なネットワークで Consumer に遅れをとることがあります。
私の質問は、複数のプロデューサーと 1 つのコンシューマーしかない場合、すべてのプロデューサーが作業を終了したことをコンシューマーに通知するにはどうすればよいですか? プロデューサーの 1 つで BlockingCollection.CompleteAdding() メソッドを呼び出すと、1 つ以上の他のプロデューサーがまだ機能している可能性があります。
c# - BlockingCollectionでDisposeを呼び出す
アルバハリの簡単な本(http://www.albahari.com/threading/part5.aspx#_BlockingCollectionT)のC#のプロデューサーコンシューマキューの例を再利用しました。同僚は次のように述べています。コレクションの破棄のBlockingCollectionについて?」
答えが見つかりませんでした。考えられる唯一の理由は、キューの残りのワークロードの実行が処理されないことです。しかし、キューを破棄するときに、処理を停止しないのはなぜですか?
「なぜBlockingCollectionを破棄すべきではないのですか?」「BlockingCollectionを破棄しないと害はありますか?」という2番目の質問もあります。多くのプロデューサーコンシューマーキューを生成/破棄していると、問題が発生すると思います(私が望んでいるのではなく、知るためだけに)。
BlockingCollection.Disposeは実際に何をしますか?BlockingCollectionには(明らかに)2つの待機ハンドルが含まれているため、Disposeを呼び出さないと問題が発生します。これを指摘してくれたken2kに感謝します。
私が話しているコード:
c# - C# 4.0 でのブロッキング コレクションのパフォーマンス
ブロッキング コレクションは、通常のキューよりも山積みになっています。次のシナリオでは、
コンシューマーとして専用のスレッドがあります。
Producer として 3 つ以上の専用スレッド。
ノーマル キュー (Monitor.Enter...) とブロッキング コレクションで確認しました。
結果:
通常のキューはある時点で自動的にクリアされ、20000 または 30000 以降は増加し続けません。しかし、ブロッキング コレクションは数十万以上増加し続けており、明らかに明確なオプションはありません。同時に、プロデューサーを制限したくありません。
誰でも光を当てることができますか..