我有一些需要并行处理的特定项目流,因此我正在使用
所做的工作非常耗费 CPU 资源,异步锁极少,因此我的解决方案是创建一个大小为
创建:
所以,我的问题是,这是我问题的最佳解决方案吗?我是否影响了性能/可扩展性?我有没有遗漏什么?
TPL Dataflow
。但是问题在于,具有相同键(类似于字典)的项目应按照先进先出(FIFO)顺序进行处理,而不应该彼此并行处理(它们可以与具有不同值的其他项目并行处理)。所做的工作非常耗费 CPU 资源,异步锁极少,因此我的解决方案是创建一个大小为
Environment.ProcessorCount
的 ActionBlock<T>
数组,并根据键的 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);
}
所以,我的问题是,这是我问题的最佳解决方案吗?我是否影响了性能/可扩展性?我有没有遗漏什么?
(uint)key.GetHashCode() % _actionBlocks.Length
存在一种可能,即分布不均,某些核心不会执行任何操作。 - MarcinJuraszek