Mam pętlę asynchroniczną Parallel.ForEach (), z którą pobieram niektóre strony internetowe. Moja przepustowość jest ograniczona, więc mogę pobierać tylko x stron na raz, ale Parallel.ForEach wykonuje całą listę pożądanych stron internetowych.
Czy istnieje sposób ograniczenia liczby wątków lub dowolnego innego ogranicznika podczas uruchamiania Parallel.ForEach?
Kod demonstracyjny:
Parallel.ForEach(listOfWebpages, webpage => {
Download(webpage);
});
Prawdziwe zadanie nie ma nic wspólnego ze stronami, więc kreatywne rozwiązania do indeksowania stron internetowych nie pomogą.
c#
.net
asynchronous
parallel.foreach
eugeneK
źródło
źródło
Odpowiedzi:
Można określić
MaxDegreeOfParallelism
wParallelOptions
parametrze:MSDN: Parallel.ForEach
MSDN: ParallelOptions.MaxDegreeOfParallelism
źródło
var opts = new ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 1.0)) };
-1
jest takie samo, jak w ogóle jej nieokreślanie: „Jeśli [wartość] wynosi -1, nie ma ograniczenia liczby jednoczesnych uruchomionych operacji”var opts = new ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 2.0)) };
. Link do wątków vs rdzenie - askubuntu.com/questions/668538/…Możesz użyć ParallelOptions i ustawić MaxDegreeOfParallelism, aby ograniczyć liczbę współbieżnych wątków:
źródło
Użyj innego przeciążenia,
Parallel.Foreach
które zajmujeParallelOptions
wystąpienie i ustaw,MaxDegreeOfParallelism
aby ograniczyć liczbę wystąpień wykonywanych równolegle.źródło
A dla użytkowników VB.net (składnia jest dziwna i trudna do znalezienia) ...
źródło