簡體   English   中英

在運行時更改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()調用? 提前致謝。

我的Parallel.ForEach運行時,MaxDegreeOfParallelism是否會更改,或者是否始終將其設置為第一個Utils.Threads()調用? 提前致謝。

不可以,因為它不會一直檢查和修改分配的值,這在API初始化過程中是必需的。 實際上,如果您查看MaxDegreeOfParallelism的簽名,

public int MaxDegreeOfParallelism { get; set; }

因為它的值類型不是引用類型,所以它是integer ,因此在任何情況下,都將復制值,因為值的任何更改都不會引用它,這是值類型的標准行為

MaxDegreeOfParallelismParallel.ForEach調用的影響

它是一個指示符或提示,它不能確保在執行開始之前從池中提供了許多並行線程。 對於Parallel.ForEach它總是從單線程開始,並根據任務的數量和所花費的時間不斷追加並行執行的能力。 此值也在內部進行調節,不是您可以提供很高的值並期望提供許多線程。 盡管在PLinq情況下,它的行為有所不同,在處理之前,它希望大多數線程都被PLinq配置/初始化,但是如果由於上下文切換而每個線程沒有足夠的工作,它可能會對性能產生不利影響。

關於C#Parallel / PLinq API中DOP的幾個參考鏈接:

何時設置最大並行度

AsParallel()的最大並行度

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM