質問

私は並行して処理する必要がある特定の項目の一定の流れで、私は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 すべてのブロックで共有されます。このようなスケジューラを見つけることができます または MSDN

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top