376 Stimmen

Wie kann ich Parallel.ForEach einschränken?

Ich habe eine Parallel.ForEach() async-Schleife, mit der ich einige Webseiten herunterlade. Meine Bandbreite ist begrenzt, sodass ich nur x Seiten pro Zeit herunterladen kann, aber Parallel.ForEach führt die gesamte Liste der gewünschten Webseiten aus.

Gibt es eine Möglichkeit, die Anzahl der Threads oder einen anderen Begrenzer zu begrenzen, während Parallel.ForEach ausgeführt wird?

Demo-Code:

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

Die eigentliche Aufgabe hat nichts mit Webseiten zu tun, so dass kreative Web-Crawling-Lösungen nicht helfen werden.

699voto

Nick Butler Punkte 23397

Sie können eine MaxDegreeOfParallelism in einem ParallelOptions Parameter:

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

MSDN: Parallel.ForEach

MSDN: ParallelOptions.MaxDegreeOfParallelism

62voto

rikitikitik Punkte 2374

Sie können ParallelOptions verwenden und MaxDegreeOfParallelism festlegen, um die Anzahl der gleichzeitigen Threads zu begrenzen:

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

25voto

Richard Punkte 103159

Verwenden Sie eine weitere Überladung von Parallel.Foreach die eine ParallelOptions Instanz, und setzen Sie MaxDegreeOfParallelism um zu begrenzen, wie viele Instanzen parallel ausgeführt werden.

17voto

user3496060 Punkte 741

Und für die VB.net-Benutzer (die Syntax ist seltsam und schwer zu finden)...

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X