ハッシュ/破壊されたActionBlocks.
-
21-12-2019 - |
質問
私は並行して処理する必要がある特定の項目の一定の流れで、私はTPL Dataflow
を使用しています。CATHは、同じキーを共有する項目(辞書と同様)をFIFO順に処理する必要があり、互いに平行ではありません(それらは異なる値を持つ他の項目と平行にすることができます)。
最小限の非同期ロックで非常にCPUバインドされているため、My SolutionはActionBlock<T>
の配列を作成し、並列処理なしでEnvironment.ProcessorCount
のサイズを鍵のGetHashCode
値に従ってそれらに投稿することでした。
作成:
_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);
}
.
だから、私の質問は私の問題に対する最善の解決策ですか?私は性能/スケーラビリティを傷つけていますか?私は何かがありませんか?
解決
ハッシュコードがよく分布していることを知っていると仮定して、あなたのアプローチが合理的であると思います。
悪い分布に対する保護をより良い保護する場合は、単一のカスタム TaskScheduler
すべてのブロックで共有されます。このようなスケジューラを見つけることができます または
所属していません StackOverflow