- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要并行处理某些项目,所以我使用 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 ParallelExtensionsExtras或 on MSDN .
关于c# - 散列/分片 ActionBlocks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21010024/
我目前正在使用 ActionBlock 来处理串行启动的异步作业。它可以很好地处理每个发布到它的项目,但无法从每个作业中收集结果列表。 我可以使用什么以线程安全的方式收集我的作业结果? 我的代码目前是
我目前正在使用 ActionBlock 来处理串行启动的异步作业。它可以很好地处理每个发布到它的项目,但无法从每个作业中收集结果列表。 我可以使用什么以线程安全的方式收集我的作业结果? 我的代码目前是
我有一个 ActionBlock,它只处理来自无限循环的连续不断的消息。在 ActionBlock 中,我发布了一个 http 帖子。当出现任何与网络相关的错误时,该方法会抛出异常并且该 block
我认为在测试方法中,“results”集合变量的类型必须是 BlockingCollection而不是 List .如果我错了,请证明给我看。我从 https://blog.stephencleary
我们在发送到 ActionBlock 时看到了意外行为,其中似乎正在发生并行处理,即使 MaxDegreeOfParallelism 为 1。情况如下。 发布到 ActionBlock 的类如下所示:
我需要并行处理某些项目,所以我使用 TPL Dataflow。 .要注意的是,共享相同键(类似于字典)的项目应按 FIFO 顺序处理,而不是彼此平行(它们可以与具有不同值的其他项目平行)。 正在完成的
我想实现优先级 ActionBlock .这样我就可以有条件地优先考虑一些TInput使用 Predicate 的项目. 我读了 Parallel Extensions Extras Samples和
我不确定这是否可行,但如果可行,我可能做得不对。假设我有一个链接到许多消费者(ActionBlocks)的共享缓冲区。每个消费者都应该消费满足用于将其链接到缓冲区的谓词的数据。例如,ActionBlo
我有一个带有 ActionBlock 的 Receiver 类: public class Receiver : IReceiver { private ActionBlock _receiver
我一直在尝试通过创建示例应用程序来理解 TPL 数据流。我一直在尝试做的一件事是从 ActionBlock 更新 TextBox 控件。使用 TPL Dataflow 的原因是在保持顺序的同时执行并行
我正在 .Net TPL 中构建一个管道,该管道经过一系列数据转换步骤,最终需要将输出写入文件。我正在考虑使用 ActionBlock 写入文件。但是,我不确定这是否会遇到任何问题......例如多个
我对 Framework 4.0 的 ActionBlock 实现很感兴趣,因为 Framework 4.0 似乎不支持 TPL.Dataflow。更具体地说,我对接收 Func 委托(delegat
我想知道并行执行多个异步方法的推荐方法是什么? 在 System.Threading.Tasks.Dataflow 中,我们可以指定最大并行度,但无界可能也是 Task.WhenAll 的默认设置?
我正在使用 TPL DataFlow 和 ActionBlock 来创建并行性。使用 TPL DataFlow 的原因是因为它支持异步性,除了我无法让它工作。 var ab = new ActionB
刚从 System.Threading.Tasks.Dataflow 开始,不确定我是否理解 ActionBlock 中未处理异常的正确错误处理技术。 我现在所拥有的导致挂起:- ActionBloc
我有这个代码: var data = new BufferBlock(new DataflowBlockOptions { BoundedCapacity = 1 }); var action = n
我是一名优秀的程序员,十分优秀!