Как я могу ограничить Parallel.ForEach?

У меня есть асинхронный цикл Parallel.ForEach(), с помощью которого я загружаю некоторые веб-страницы. Моя пропускная способность ограничена, поэтому я могу загружать только x страниц за раз, но Parallel.ForEach выполняет весь список нужных веб-страниц.

Есть ли способ ограничить номер потока или любой другой ограничитель при запуске Parallel.ForEach?

Демо-код:

Parallel.ForEach(listOfWebpages, webpage => {
  Download(webpage);
});

Настоящая задача не имеет ничего общего с веб-страницами, поэтому креативные решения для сканирования веб-страниц не помогут.

5 ответов

Решение

Вы можете указать MaxDegreeOfParallelism в ParallelOptions параметр:

Parallel.ForEach(
    listOfWebpages,
    new ParallelOptions { MaxDegreeOfParallelism = 4 },
    webpage => { Download(webpage); }
);

MSDN: Parallel.ForEach

MSDN: ParallelOptions.MaxDegreeOfParallelism

Вы можете использовать ParallelOptions и установить MaxDegreeOfParallelism, чтобы ограничить количество одновременных потоков:

Parallel.ForEach(listOfwebpages, new ParallelOptions{MaxDegreeOfParallelism=2}, webpage => {Download(webpage);});     

Используйте другую перегрузку Parallel.Foreach это занимает ParallelOptions экземпляр и установить MaxDegreeOfParallelism ограничить количество экземпляров, выполняемых параллельно.

И для пользователей VB.net (синтаксис странный и трудно найти)...

Parallel.ForEach(listOfWebpages, New ParallelOptions() With {.MaxDegreeOfParallelism = 8}, Sub(webpage)
......end sub)  

Я думаю, что более динамичным и реалистичным подходом было бы ограничить его количеством процессоров, чтобы в каждой системе он работал правильно:

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

возможно, ты бы умножилEnvironment.ProcessorCountили разделите его, чтобы увеличить нагрузку на процессор

Другие вопросы по тегам