【问题标题】:Change Parallel.ForEach MaxDegreeOfParallelism while running?运行时更改 Parallel.ForEach MaxDegreeOfParallelism?
【发布时间】:2023-03-04 20:46:01
【问题描述】:

假设我有一个Parallel.ForEach 在我的代码中运行,而ParallelOption MaxDegreeOfParallelism 设置为Utils.Threads() 就像这样:

Parallel.ForEach(linesList, new ParallelOptions { MaxDegreeOfParallelism = Utils.Threads() }, line => ...

现在假设Utils.Threads() 返回一个介于 1 和 10 之间的随机整数。

MaxDegreeOfParallelism 会在我的Parallel.ForEach 运行时更改,还是会一直设置为第一个Utils.Threads() 调用?提前致谢。

【问题讨论】:

  • 我冒昧地猜测,一旦初始化,您将无法修改它。我阅读了 msdn 页面,找不到任何提及您可以(或不能)的内容,但我会在您不能的方面犯错。

标签: c# multithreading parallel.foreach


【解决方案1】:

在我的 Parallel.ForEach 运行时 MaxDegreeOfParallelism 会发生变化,还是会一直设置为第一个 Utils.Threads() 调用?提前致谢。

不,它不会,因为它不会继续检查和修改分配的值,而这在 API 初始化期间是必需的。事实上,如果您查看MaxDegreeOfParallelism 的签名,

public int MaxDegreeOfParallelism { get; set; }

因为它是一个值类型而不是引用类型,它的integer,所以在任何情况下,值都会被复制,它永远不会因为值的任何变化而被引用,值类型的标准行为

MaxDegreeOfParallelismParallel.ForEach 通话的影响

它是一个指标或提示,它不能确保在执行开始之前从池中提供了许多并行线程。对于Parallel.ForEach,它总是从单线程开始,并根据任务数量和它们花费的时间不断增加并行执行的能力。 这个值也是内部调节的,并不是说您可以提供非常高的值并期望提供许多线程。尽管在PLinq 的情况下它的行为有所不同,在处理之前它会期望大多数线程被预置/初始化,但如果每个线程没有足够的工作,由于上下文切换,它可能会对性能产生不利影响

几个参考链接,关于 C# Parallel / PLinq API 中的 DOP:

When to set the max degree of parallelism

Max Degree of Parallelism for AsParallel()

【讨论】:

  • 非常好的答案,帮助我更好地理解它!既然您似乎对这个主题相当了解,那么除了 Parallel.ForEach 之外,还有其他方法可以与我的列表做同样的事情吗?谢谢!
  • 欢迎,另一个重要的点,因为MaxDegreeOfParallelism,是一个值类型,int,所以在任何情况下,一旦值不能被引用以进行任何更改,它就会被复制,这只会发生在引用类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
相关资源
最近更新 更多