私は並列処理が必要な特定のアイテムのフローが一定であるため、TPL Dataflow
を使用しています。キャッチは、同じキー(ディクショナリに似ています)を共有するアイテムは、FIFO順で処理され、互いに平行ではなく(異なる値を持つ他のアイテムと平行になることがあります)ということです。作業が行われてハッシュ/シャードされたActionBlocks
は、私の解決策はありません並列処理とEnvironment.ProcessorCount
のActionBlock<T>
Sサイズの配列を作成し、キーのGetHashCode
値に応じて、それらに投稿することだったので、最小限の非同期ロックを結合した非常にCPUです。
作成:
_actionBlocks = new ActionBlock<Item>[Environment.ProcessorCount];
for (int i = 0; i < _actionBlocks.Length; i++)
{
_actionBlocks[i] = new ActionBlock<Item>(_ => ProcessItemAsync(_));
}
使用法:
bool ProcessItem(Key key, Item item)
{
var actionBlock = _actionBlocks[(uint)key.GetHashCode() % _actionBlocks.Length];
return actionBlock.Post(item);
}
だから、私の質問があり、これは私の問題に最適なソリューションですか?パフォーマンス/スケーラビリティが傷つきますか?何か不足していますか?
私はそれが好きです。私は記憶を必要としない別の方法を考えることはできません。私はあなたのハッシュコードが適切に配布されていることを確認している限り、これはうまくいくはずです。 – spender
'GetHashCode'の値に頼ると、私にはとても奇妙に聞こえますが、なぜあなたはそれを持っていますか?実際の要件「等しい項目はFIFO順に処理する必要がありますか」 – svick
@svickもっと同じようなキーを持つアイテムは、あなたが辞書を使う方法と同じようにFIFO順に処理されるべきです(本当に同じアイテムタイプである必要はありません)。私はそのことを明確にするために質問を更新します。 – i3arnon