我怎样才能限制Parallel.ForEach?

eug*_*neK 282 .net c# asynchronous parallel.foreach

我有一个Parallel.ForEach()异步循环,我下载了一些网页.我的带宽有限,所以我每次只能下载x页,但Parallel.ForEach会执行所需网页的完整列表.

有没有办法在运行Parallel.ForEach时限制线程号或任何其他限制器?

演示代码:

Parallel.ForEach(listOfWebpages, webpage => {
  Download(webpage);
});
Run Code Online (Sandbox Code Playgroud)

真正的任务与网页无关,因此创意网络抓取解决方案无济于事.

Nic*_*ler 534

您可以MaxDegreeOfParallelismParallelOptions参数中指定a :

Parallel.ForEach(
    listOfWebpages,
    new ParallelOptions { MaxDegreeOfParallelism = 4 },
    webpage => { Download(webpage); }
);
Run Code Online (Sandbox Code Playgroud)

MSDN:Parallel.ForEach

MSDN:ParallelOptions.MaxDegreeOfParallelism

  • 它可能不适用于这个特殊情况,但我想我会抛弃它,万一有人想知道这个并发现它有用.在这里,我使用75%(四舍五入)的处理器数量.`var opts = new ParallelOptions {MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount*0.75)*1.0))};` (52认同)
  • 要清楚核心和线程不是一回事.根据CPU的不同,每个核心的线程数不同,通常每个核心有2个.例如,如果你有一个4核CPU,每个核心有2个线程,那么你最多有8个线程.调整@jKlaus注释`var opts = new ParallelOptions {MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount*0.75)*2.0))};`.链接到线程与核心 - https://askubuntu.com/questions/668538/cores-vs-threads-how-many-threads-should-i-run-on-this-machine (7认同)
  • 只是为了保存其他必须在文档中查找的人,传递值为"-1"与完全不指定它是相同的:_"如果[值]为-1,则对数字没有限制同时运行的操作"_ (4认同)

rik*_*tik 41

您可以使用ParallelOptions并设置MaxDegreeOfParallelism来限制并发线程的数量:

Parallel.ForEach(
    listOfwebpages, 
    new ParallelOptions{MaxDegreeOfParallelism=2}, 
    webpage => {Download(webpage);});     
Run Code Online (Sandbox Code Playgroud)


Ric*_*ard 21

使用另一个Parallel.Foreach带有ParallelOptions实例的重载,并设置MaxDegreeOfParallelism为限制并行执行的实例数.


use*_*060 11

而对于VB.net用户(语法很奇怪,很难找到)......

Parallel.ForEach(listOfWebpages, New ParallelOptions() With {.MaxDegreeOfParallelism = 8}, Sub(webpage)
......end sub)  
Run Code Online (Sandbox Code Playgroud)


小智 5

我认为更动态和现实的方法是通过处理器数量来限制它,这样在每个系统上它都会正常运行:

var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount };
Parallel.ForEach(myList, options, iter => { });
Run Code Online (Sandbox Code Playgroud)

也许你会乘以Environment.ProcessorCount或除以它来给 CPU 施加或承受更大的压力