散列/分片ActionBlocks

时间:2014-01-09 01:25:04

标签: c# .net task-parallel-library async-await tpl-dataflow

我需要并行处理某些项目,因此我正在使用TPL Dataflow。问题在于,共享相同密钥(类似于字典)的项目应按FIFO顺序处理,而不是彼此平行(它们可以与具有不同值的其他项目并行)。

正在完成的工作是CPU绑定最小的异步锁,所以我的解决方案是创建一个ActionBlock<T>的数组,其大小为Environment.ProcessorCount,没有并行性,并根据密钥{发布到它们{ {1}}值。

创建:

GetHashCode

用法:

_actionBlocks = new ActionBlock<Item>[Environment.ProcessorCount];
for (int i = 0; i < _actionBlocks.Length; i++)
{
    _actionBlocks[i] = new ActionBlock<Item>(_ => ProcessItemAsync(_));
}

所以,我的问题是,这是我问题的最佳解决方案吗?我是否会损害性能/可扩展性?我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

我认为您的方法是合理的,假设您知道哈希码将很好地分发。

如果您希望更好地防范错误分发,可以使用更大数量的ActionBlock,同时通过使用所有块共享的单个自定义TaskScheduler来限制其总并发级别。您可以找到此类日程安排程序in ParallelExtensionsExtrason MSDN