下面是 ForEachAsync
的实现 written by Stephen Toub .
public static Task ForEachAsync<T>(this IEnumerable<T> source, int dop,
Func<T, Task> body)
{
return Task.WhenAll(
from partition in Partitioner.Create(source).GetPartitions(dop)
select Task.Run(async delegate {
using (partition)
while (partition.MoveNext())
await body(partition.Current);
}));
}
指定 partitionCount(在本例中为 dop
)时应考虑哪些因素?
硬件是否有所不同(内核数量、可用 RAM 等)?
数据/操作的类型会影响计数吗?
对于一般情况,我的第一个猜测是将 dop
设置为等于 Environment.ProcessorCount
,但我的直觉告诉我这可能无关。
最佳答案
硬件和执行的操作都很重要。
如果你想运行不受任何其他方式限制的 CPU 绑定(bind)工作,你根本不需要方法。您最好使用为此而设计的 Parallel
或 PLINQ
(并且在 IO 方面非常糟糕)。
对于 IO 而言,没有简单的方法可以预测最佳 DOP。例如,DOP 1 之类的磁盘。4-16(?) 之类的 SSD。 Web 服务几乎可以接受任何值。我可以继续列出更多因素,包括数据库、锁争用等。
您需要在测试环境中测试不同的数量。然后,使用性能最佳的值。
使用 Environment.ProcessorCount
对 IO 毫无意义。添加 CPU 时,IO 不会变快。
关于c# - 确定 ForEachAsync 并行度的因素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34359509/