問題タブ [concurrent-collections]
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# - 固定サイズの FIFO キューを使用したプロデューサー/コンシューマー パターン
固定サイズの FIFO キューにプロデューサー/コンシューマー パターンを実装する必要があります。ConcurrentQueue のラッパー クラスがこれで機能する可能性があると思いますが、完全にはわかりません (以前に ConcurrentQueue を使用したことがありません)。これのひねりは、キューが固定数のアイテム (私の場合は文字列) のみを保持する必要があることです。私のアプリケーションには、1 つのプロデューサー タスク/スレッドと 1 つのコンシューマー タスク/スレッドがあります。私の消費者タスクが実行されると、その時点でキューに存在するすべてのアイテムをキューから取り出して処理する必要があります。
価値のあることとして、消費者によるキューに入れられたアイテムの処理は、100% 信頼できない Web アプリに SOAP 経由でアイテムをアップロードすることに他なりません。接続を確立できない場合、または SOAP 呼び出しの呼び出しが失敗した場合は、それらの項目を破棄して、キューに戻って詳細を確認する必要があります。SOAP のオーバーヘッドのため、1 回の SOAP 呼び出しで送信できるキューからの項目数を最大化しようとしました。
場合によっては、消費者がアイテムを削除して処理するよりも、生産者がアイテムを追加する方が速い場合があります。キューがすでにいっぱいで、プロデューサーが別のアイテムを追加する必要がある場合、キューのサイズが固定されたままになるように、新しいアイテムをキューに入れ、最も古いアイテムをデキューする必要があります。基本的に、生成された最新のアイテムを常にキューに保持する必要があります (コンシューマーが現在前のアイテムを処理しているため、一部のアイテムが消費されないことを意味する場合でも)。
キュー内のアイテムが固定されている場合にプロデューサーが数を維持することに関して、この質問から1つの潜在的なアイデアを見つけました。
新しいエンキュー時に古い値を自動的にデキューする固定サイズのキュー
私は現在、次のような Enqueue() メソッドを使用して ConcurrentQueue の周りにラッパー クラス (その回答に基づく) を使用しています。
次のように、キューにサイズ制限のあるこのクラスのインスタンスを作成します。
プロデューサー タスクを開始すると、キューがいっぱいになり始めます。私の Enqueue() メソッドのコードは、アイテムを追加するとキューの数が最大サイズを超えたときにキューから最も古いアイテムを削除することに関して、適切に機能しているようです。ここで、アイテムをデキューして処理する消費者タスクが必要ですが、ここで私の頭が混乱します。ある時点でキューのスナップショットを取得し、処理のためにすべての項目をデキューするコンシューマ用の Dequeue メソッドを実装する最良の方法は何ですか (プロデューサーは、このプロセス中にまだ項目をキューに追加している可能性があります)。
.net - TSQL ADO.NET で返される不正な行数
C# .NET 4.0 には、次から取得した BlockingCollection があります。
サンプル BC_AddTakeCompleteAdding
私の問題は、.NET の SQLCommand.ExecuteNonQuery が間違った行数を返すことです。
更新は主キーにあるため、1 行を取得する必要があります。
正しい番号を取得する場合もあります。
.NET で 1 より大きい数値 (100 ~ 10000) を取得することがよくあります。
また、同じ PK に対してまったく同じ TSQL を実行した場合でも、常に同じ間違った番号になるとは限りません。
TSQL を SSMS にコピー ペーストして、毎回正しい答え (1) を得ることができます。
使用中の変数を宣言し、rowsRet5 という名前の他の変数がない
その textHash 値を確認したところ、1 行だけが更新されました。
適切な更新を実行しているように見えますが、間違ったカウントを報告します。
カウントが間違っているとすれば、これを本番データで使用するつもりはありません。
このコマンドは、コンシューマー側の最後にあります。
この更新の上に 2 つの .BeginExecuteNonQuery があります。
これらの更新は別のテーブルに対するものであり、docSVsys を参照していません。
これらのテーブルには、docSVsys への FK 参照があります。
デバッグでコールバックで停止した場合 (速度を落とした場合)、このエラーは発生しません。
タスクの BeginExecuteNonQuery が問題ではないかどうか疑問に思っています。
この間違った rowCount は、非同期の rowCounts のいずれにも一致しませんが、同じ範囲にあります。
この基本コードは、数百万行を処理しました。
TSQL は一切変更していません。
プロデューサー・コンシューマーに変換したらダメだった。
ドキュメントを進行中としてマークするには、プロデューサー側で非常によく似た TSQL を使用しますが、問題はありません。そのループには、BeginExecuteNonQuery もあります。
c#-4.0 - Parallel foreach ConcurrentDictionary追加
電話帳のようなエントリがあります:名前+住所。ソースはWebサイトにあり、カウントは1,000レコードを超えています。
質問は:
でどのように使用/実装 ConcurrentDictionary
しParallelForeach
ますか?
私はそれがより良いパフォーマンスをするかどうか尋ねたほうがいいかもしれません:
ConcurrentDictionary
&ParallelForeach
vs
Dictionary
&foreach
名前がキーと重複することは許可されてConcurrentDictionary
いないので、キーが存在しない場合にのみadd()を追加する独自の組み込み関数があることを正しく理解したと思いますTryAdd
。ConcurrentDictionary
そのため、すでに処理されている重複キーの追加を許可しないという問題が発生したため、その時点から、バランスが標準シーケンシャルではなく方向に向かっていることがはっきりとわかりました。Dictionary
では、特定のデータソースから名前とアドレスを追加し、Parallelforeachを介してConcurrentDictionaryにロードするにはどうすればよいですか?
c# - ConcurrentQueue の使用法>
基本的に、スレッド内のカメラから取得した画像コレクションのコンテナーを探しています。ConcurrentQueue はスレッドセーフなので、それを使いたかったのです。しかし、コードをデバッグしているときに、この記事が言っているのを見つけました
要素が小さい場合、おそらくこれに気付かないでしょう。ただし、要素が大きなリソースを保持している場合 (たとえば、各要素が巨大な画像ビットマップである場合)、この影響が見られる可能性があります (回避策の 1 つは、ラッパー オブジェクトをキューに入れること
ConcurrentQueue<StrongBox<T>>
ですConcurrentQueue<T>
。ラッパーがキューから取り出された後、T 値へのラッパーの参照を出力します)。
私が見る限り、StrongBox
元の値の一種のラッパーです。別の画像コレクションを保存する必要があるということですか?
だから私は使用法または例を探していますConcurrentQueue<StrongBox<T>>.
Googleから見つけたのはこのコードだけです。
c# - Collections.Generic.Queue には Synchronized メソッドがないのに Collections.Queue にはあるのはなぜですか?
System.Collections.Queue
クラスにQueue.Synchronized
は、スレッドセーフな Queue 実装を返すメソッドがあります。
しかし、一般的なものにはメソッドSystem.Collections.Generic.Queue
がありませんSynchronized
。この時点で、私は次の 2 つの質問を念頭に置いています。
- 一般的なものにこのメソッドがないのはなぜですか? フレームワーク API の設計上の決定ですか?
- 返されるキューは クラスとどう
Queue.Synchronized
違うのですか?ConcurrentQueue<T>
ありがとう。
java - ConcurrentHashMap をいつ使用するか
重複の可能性:
ConcurrentHashMap と Collections.synchronizedMap(Map) の違いは何ですか?
HashMap、Collenctions.synchonizedMap、および ConcurrentHashMap の違いを読んでいました。私の理解では、 Collections.synchronizedMap がコレクション全体にロックを適用したため、パフォーマンスのオーバーヘッドが発生しました。ただし、ConcurrentHashMap は同期を使用しません。セグメントを使用して結果を達成するため、HashMap と同様のパフォーマンスを提供します。
私の理解が正しいかどうか提案してください。また、この場合、複数のスレッドがアクセスしていなくても、どこでも ConcurrentHashMap を使用できますか?
c# - IProducerConsumerCollection.TryAdd/.TryTake - いつ true/false を返しますか?
別のスレッドがコレクションを使用しているため、呼び出すときIProducerConsumerCollection<T>.TryAdd(<T>)
、またはIProducerConsumerCollection<T>.TryTake(out <T>)
これらが失敗することはありますか?
それとも、他のスレッドがコレクションを終了した後でも、Add するスペースや Take する何かがある場合、常に true を返すということですか?
ここには何も表示されません: http://msdn.microsoft.com/en-us/library/dd287147.aspx
c# - 同時コレクションへの追加
並行コレクション(たとえば、ConcurrentDictionary)を操作する場合、TryAddメソッドを使用する必要がありますか、それとも単なる古いインデックス割り当てを使用する必要がありますか?つまり、追加時にTryAddメソッドがブロックされるので、別のスレッドが値を削除しようとすると、追加が完了するまで待機する必要がありますか?
java - プロデューサー/コンシューマー スレッドと 50% オーバーラップするスライディング ウィンドウ
私はJavaで次のシナリオを持っています:
- 1 つのプロデューサー スレッドがイベント オブジェクトをキューに格納します。それをブロックすることはオプションではありません。常に各要素をキューの最後に格納して終了する必要があります(したがって、制限されたキューはありません)。
- 1 つのコンシューマー スレッドが、キューに WINDOW_SIZE の数のイベントが含まれるのを待ちます。次に、処理のためにキューからすべての WINDOW_SIZE イベントを取得する必要がありますが、50% のオーバーラップのために、それらの半分 (つまり、WINDOW_SIZE/2) のみを削除する必要があります。
私の質問は、これを効率的に実装するためにどの (同時) コレクションを使用するかということです。イベントは、リソースが制限されたデバイス (Android を実行している携帯電話) で 100Hz で受信されます。私は次のものを使用することを考えましたが、どれも適切に適合していないようです:
- 変更されるたびにキューのサイズをチェックし、WINDOW_SIZE イベントが利用可能な場合はコンシューマーで peek()/poll() を使用する ConcurrentLinkedQueue。これは少し面倒そうです。
- ArrayBlockingQueue、再びキュー サイズをチェックし、drainTo() を使用します。ただし、そのメソッドには次のドキュメントがあります。「[...]さらに、操作の進行中に指定されたコレクションが変更された場合、この操作の動作は未定義です。[...]」. これは、並行コレクションでは少し奇妙に思えます。
コード例を次に示します。
ちなみにGoogle Guavaも使っているので、聞いたことのない素敵なコレクションがあれば紹介してください。
だから:これを効率的かつきれいに解決する方法はありますか?
c# - C# スロットリング For ループ
初期状況
.NET Framework 4.0、C#、Winform アプリケーションを開発しています。アプリケーションは、GridView に WebServiceOperations を一覧表示 (およびテスト) します (現在 60 DataRows => WebServiceOperations)。
目的
ボタンを1回クリックするだけで、このすべての操作をテスト/呼び出す必要があります。すべての操作で、クラスの新しいインスタンスが作成されます。このクラス内で、WebServiceOperation async を呼び出し、結果を待ちます。その後、結果が検証されます。デリゲートとイベントを使用すると、コード全体がスムーズに機能します。
次に、課題/質問について説明します。そのボタンをクリックすると、for ループ (int i = 0; i < gridViewWsOperations.RowCount; i++) => を使用します。つまり、現在、60 の操作を実行しています。同時に ' => サーバーが同時に 60 個のリクエストを処理する過負荷になり、タイムアウトが発生します。したがって、同時に 10 と言うように、同時リクエストの数をどうにかして調整する必要があります。for ループ (リクエストをエンキューする必要がある場所) が、リクエストをデキューするメソッド (process_result イベント) と同じスレッドにないことを考慮してください。このタイプのコレクションはスレッドセーフのように見えるため、ConcurrentQueue を使用して試しました。
リンク
サンプルコードは本当に役に立ちます!
--- これは私のソリューション/サンプル コードです ---