【问题标题】:Can we have control over CPU usage when using Parallel.Foreach in C#?在 C# 中使用 Parallel.Foreach 时,我们可以控制 CPU 使用率吗?
【发布时间】:2022-04-03 18:45:48
【问题描述】:

我想使用Parallel.Foreach处理数千条记录,但是CPU使用率是100%。

Parallel.ForEach(PhotoPaths, new ParallelOptions { MaxDegreeOfParallelism = 10 }, photopath =>
{
    RemovePhoto(photo);
});

public void RemovePhoto(string photopath)
{
    File.Delete(photopath); 
} 

如果我使用MaxDegreeOfParallelism = 2,我的操作就会超时。

对于正常的 foreach 循环,它会超时,所以我选择了Parallel.Foreach,我的任务正在完成,但唯一的问题是 CPU 利用率为 100%。如果我们有任何替代方案,请告诉我。

【问题讨论】:

  • but the cpu usage is 100 % - 这是并行处理点,同时利用所有内核。
  • 如果 CPU 使用率为 100%,那么您正在使用所有可用的 CPU 周期...您还期待什么?
  • 如果您认为 100% 是个问题,请查看ZOMG! This program is using 100% CPU!1! Think of the puppies!!11!!1!1!eleven。如果您想限制处理记录的速度,那么它可能是 throttling when using Parallel.For 的重复项
  • 文件在什么存储上?这里 100% 的 CPU 似乎很奇怪,预计存储会成为瓶颈。
  • TBH,它可能是删除文件的代码,但这不是我们看到的帖子。您已经设置了正确的MaxDegreeOfParallelism,所以它是另一回事。你能不能试试这个来限制它们,MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 1.0)),它应该把它限制在 75% 左右。你知道你有多少个处理器吗?

标签: c# parallel-processing cpu-usage parallel.foreach


【解决方案1】:

与 cmets 中的某些人不同,我理解您的问题的重点。想要控制一个进程使用的 CPU 数量是非常合理的。可能的最快/最多 CPU 并不总是可取的。例如,您可能有一个需要以响应方式处理请求的顶级线程。或者您可能希望在此过程运行时使用您的计算机。因此,更好的选择是使用少于 100% 的 CPU。

我在家里运行一个分布式应用程序,根据设置,它在无人看管的 PC 上以 100% 的 CPU 运行,在正在使用的 PC 上以 50% 的速度运行...

是的,试试 MaxDegreeOfParallelism = Environment.ProcessorCount / 2

(默认 MaxDegreeOfParallelism 设置为 Environment.ProcessorCount)

另外,对此感到抱歉,我个人不喜欢当人们开始问为什么这是为什么而不是仅仅回答问题时......但是当你说你的循环超时时,等待的是什么要删除的文件?您可以在闲暇时将删除请求排队并在循环外,在另一个线程/任务上删除它们,而无需让调用者等待吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    相关资源
    最近更新 更多