并行执行函数和合理数量的实例

时间:2018-05-28 11:07:51

标签: c# parallel.foreach

我有一个对象列表,我必须对它们中的每一个进行一些详细说明,所有这些都在最短的时间内完成。

由于这些阐述是彼此独立的,我们决定与Parallel.ForEach同时进行。

Parallel.ForEach(hugeObjectList,
    new ParallelOptions { MaxDegreeOfParallelism = 50 },
    obj => DoSomeWork(obj)
);

由于我在ParallelOptions.MaxDegreeOfParallelism(例如50或100)上设置一个庞大的数字似乎是不合理的,我们怎样才能找到最佳数量的并行任务来处理这个列表呢?

Parallel.Foreach是否在另一个核心上启动了DoSomeWork? (所以,既然我们有4个核心,那么正确的并行度将是4?)

3 个答案:

答案 0 :(得分:1)

我认为这说明了一切

  

默认情况下,For和ForEach将使用底层调度程序提供的许多线程,因此从默认值更改MaxDegreeOfParallelism只会限制将使用多少并发任务。

MSDN

答案 1 :(得分:1)

询问平台应该让你接近最佳状态(对于CPU绑定工作)。

new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount  },

什么都不做是另一个非常好的选择,即

//new ParallelOptions { MaxDegreeOfParallelism = 50 },

修改

  

有很多关于数据库的io ......

这使MaxDegreeOfParallelism = 1成为另一个非常好的候选人。或者也许是2。

您真正应该关注的是异步/等待和异步数据库调用。不是Parallel类。

答案 2 :(得分:0)

唯一可以确定的方法是测试它。更多线程不等于更好的性能,并且可能经常产生更差的性能。一些想法:

  1. 为单个线程设计算法,然后添加Parallel.For周围没有意义。您必须更改算法以利用多个线程,否则并行处理的好处将是次要的或负面的。

  2. 如果您正在通过网络连接读取磁盘或通过网络连接下载数据,服务器能够以获取数据的速度为您提供数据,您可能会发现生产者/消费者模式效果最佳。如果处理的计算成本很高,请使用许多消费者线程(我倾向于使用Num Cores - 2.一个用于UI,一个用于生产者)。如果计算成本不高,则无论您使用多少个消费者线程都无关紧要。

  3. 如果您从各种来源下载来自互联网的数据,并且服务器需要时间来响应,您应该启动相当多的线程(50-100并不疯狂)。这是因为线程只会坐在那里等待服务器响应。