更改 Parallel.ForEach MaxDegreeOfParallelism 而 运行?
Change Parallel.ForEach MaxDegreeOfParallelism while running?
假设我的代码中有一个 Parallel.ForEach
运行,其中 ParallelOption
MaxDegreeOfParallelism
设置为 Utils.Threads()
,就像这样:
Parallel.ForEach(linesList, new ParallelOptions { MaxDegreeOfParallelism = Utils.Threads() }, line => ...
现在假设 Utils.Threads()
返回一个 1 到 10 之间的随机整数。
当我的 Parallel.ForEach
是 运行 时 MaxDegreeOfParallelism
会改变,还是会一直设置为第一个 Utils.Threads()
调用?提前致谢。
Will the MaxDegreeOfParallelism change while my Parallel.ForEach is running, or will it be set to the first Utils.Threads() call for all the time ? Thanks in advance.
不,它不会,因为它不会不断检查和修改分配的值,而这在 API 初始化期间是必需的。事实上,如果您查看 MaxDegreeOfParallelism
、
的签名
public int MaxDegreeOfParallelism { get; set; }
因为它是值类型而不是引用类型,所以它 integer
,所以在任何情况下,值都会被复制,它永远不会被引用以进行值的任何更改,值类型的标准行为
Impact of MaxDegreeOfParallelism
on Parallel.ForEach
call
它是一个指示器或提示,它不能确保在执行开始之前从池中提供许多并行线程。对于 Parallel.ForEach
,它总是从单线程开始,并根据任务的数量和所花费的时间不断增加并行执行的能力。
这个值也是内部调节的,并不是说你可以提供一个非常高的值并期望提供很多线程。它虽然在 PLinq
的情况下表现不同,在处理之前它会期望大多数线程被配置/初始化,但它可能会对性能产生不利影响,如果每个线程都没有足够的工作,由于上下文切换
几个参考链接,关于 C# Parallel/PLinq 中的 DOP API:
When to set the max degree of parallelism
Max Degree of Parallelism for AsParallel()
假设我的代码中有一个 Parallel.ForEach
运行,其中 ParallelOption
MaxDegreeOfParallelism
设置为 Utils.Threads()
,就像这样:
Parallel.ForEach(linesList, new ParallelOptions { MaxDegreeOfParallelism = Utils.Threads() }, line => ...
现在假设 Utils.Threads()
返回一个 1 到 10 之间的随机整数。
当我的 Parallel.ForEach
是 运行 时 MaxDegreeOfParallelism
会改变,还是会一直设置为第一个 Utils.Threads()
调用?提前致谢。
Will the MaxDegreeOfParallelism change while my Parallel.ForEach is running, or will it be set to the first Utils.Threads() call for all the time ? Thanks in advance.
不,它不会,因为它不会不断检查和修改分配的值,而这在 API 初始化期间是必需的。事实上,如果您查看 MaxDegreeOfParallelism
、
public int MaxDegreeOfParallelism { get; set; }
因为它是值类型而不是引用类型,所以它 integer
,所以在任何情况下,值都会被复制,它永远不会被引用以进行值的任何更改,值类型的标准行为
Impact of
MaxDegreeOfParallelism
onParallel.ForEach
call
它是一个指示器或提示,它不能确保在执行开始之前从池中提供许多并行线程。对于 Parallel.ForEach
,它总是从单线程开始,并根据任务的数量和所花费的时间不断增加并行执行的能力。
这个值也是内部调节的,并不是说你可以提供一个非常高的值并期望提供很多线程。它虽然在 PLinq
的情况下表现不同,在处理之前它会期望大多数线程被配置/初始化,但它可能会对性能产生不利影响,如果每个线程都没有足够的工作,由于上下文切换
几个参考链接,关于 C# Parallel/PLinq 中的 DOP API:
When to set the max degree of parallelism
Max Degree of Parallelism for AsParallel()