我需要并行处理某些项目,因此我正在使用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(_));
}
所以,我的问题是,这是我问题的最佳解决方案吗?我是否会损害性能/可扩展性?我错过了什么吗?
答案 0 :(得分:3)
我认为您的方法是合理的,假设您知道哈希码将很好地分发。
如果您希望更好地防范错误分发,可以使用更大数量的ActionBlock
,同时通过使用所有块共享的单个自定义TaskScheduler
来限制其总并发级别。您可以找到此类日程安排程序in ParallelExtensionsExtras或on MSDN。