Как я могу ограничить 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
Вы можете использовать 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
или разделите его, чтобы увеличить нагрузку на процессор