Parallel.ForEach - 处理串行约束?

时间:2016-12-09 19:03:21

标签: c# .net parallel-processing

概述

假设存在一个主要可以并行处理的列表,但是您希望保证不会同时处理具有相同属性的两个对象。

例如,假设每个对象都有一个Color属性,并且您希望确保每个颜色都按顺序处理。让我们假设会有很多很多颜色,所以只使用一个简单的分区就会效率低下。

那么,如何在可能的情况下并行处理列表,但是添加一个串行约束,以便不会同时处理具有相同约束的两个对象?

研究

显然,Akka.net允许使用consistent hashing将消息路由到演员的方法,这是确保相同颜色的对象被串行处理的一种方法。我正在寻找类似的方法,而不必使用akka,因为我不想仅仅为了获得这个功能而投资于框架。

最好,我想将一些东西插入Parallel.ForEach循环,而不是使用任务并行库或其他低级构造。

在伪代码中,我希望能够做到这样的事情:

IEnumerable<Widget> list = getWidgets()
var partitionedList = list.PartionBy(elem => elem.Color)
Parallel.ForEach(partitionedList, (widget) => ProcessWidget(widget));

如果我必须从头开始这样做,我会编写一个任务队列来旋转自己的线程池,然后根据一致的哈希将任务路由到线程。每个线程都需要自己的任务队列。

当然,这几乎描述了使用Actor系统,所以如果这不容易做到,我可能会咬紧牙关并使用Akka.net。

0 个答案:

没有答案