gpt4 book ai didi

c# - 散列/分片 ActionBlocks

转载 作者:太空狗 更新时间:2023-10-29 21:50:22 26 4
gpt4 key购买 nike

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

正在完成的工作非常受 CPU 限制,异步锁最少,所以我的解决方案是创建一个 ActionBlock<T> 的数组。 s 的大小 Environment.ProcessorCount没有并行性并根据 key 的 GetHashCode 发布给他们值(value)。

创作:

_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);
}

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

最佳答案

我认为你的方法是合理的,假设你知道散列码会很好地分布。

如果您想更好地防止不良分布,您可以使用更多的 ActionBlock,同时通过使用单个自定义 TaskScheduler 来限制它们的总并发级别。由所有 block 共享。你可以找到这样的调度程序 in ParallelExtensionsExtrason MSDN .

关于c# - 散列/分片 ActionBlocks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21010024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com