我有一个表名列表(学生,考试,学校)。
我使用Parallel.ForEach
循环来遍历表名,并使用来处理每个表MaxDegreeOfParallelism = 8
。
我的问题是我Parallel.ForEach
并不总是从事偷工作的工作。例如,当两个表要处理时,它们可以一个接一个地处理而不是并行处理。我正在尝试提高性能并增加吞吐量。
我试图通过创建一个自定义来实现这一点TaskScheduler
,但是,对于我的实现,我需要一个排序的任务列表,其中最简单的任务首先被排序,以便它们不会被运行时间更长的表所阻止。我似乎无法通过对传递给Parallel.ForEach
(List< string >
)的列表进行排序来执行此操作,因为任务按TaskScheduler
无序入队。因此,我需要一种基于https://psycodedeveloper.wordpress.com/2013/06/28/a-custom-taskscheduler-in-c/在CustomTaskScheduler中对任务列表进行排序的方法
如何控制,其中将任务通过了秩序Parallel.ForEach
的TaskScheduler
要排队?
该Parallel.ForEach
方法根据源的类型采用两种不同的分区策略。如果源是数组或List
,则将对其进行静态分区(预先)。如果来源是诚实¹ IEnumerable
,则对它进行动态分区(在旅途中)。动态分区具有所需的工作窃取行为,但具有更多开销。在您的情况下,开销并不重要,因为工作负载的粒度非常低。
为了确保分区是动态的,最简单的方法是使用以下Partitioner.Create
方法包装您的源:
string[] tableNames;
Parallel.ForEach(Partitioner.Create(tableNames), tableName =>
{
// Process table
});
¹(该表达式是从源代码中的注释中借用的)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句