Was ist der Unterschied zwischen der Verwendung eines neuen Threads und der Verwendung eines Threads aus dem Thread-Pool? Welche Leistungsvorteile gibt es und warum sollte ich in Betracht ziehen, einen Thread aus dem Pool zu verwenden, anstatt einen, den ich explizit erstellt habe? Ich denke hier speziell an .NET, aber allgemeine Beispiele sind in Ordnung.
quelle
Der von .NET verwaltete Threadpool: -
Es gibt andere Thread-Pool-Implementierungen, die für länger laufende Vorgänge möglicherweise besser geeignet sind.
Verwenden Sie insbesondere einen Thread-Pool, um zu verhindern, dass Ihre App zu viele erstellt Threads erstellt. Das wichtigste Merkmal eines Threadpools ist die Arbeitswarteschlange. Das heißt, sobald Ihr Computer ausreichend ausgelastet ist, stellt der Threadpool Anforderungen in die Warteschlange, anstatt sofort weitere Threads zu erzeugen.
Wenn Sie also eine kleine, begrenzte Anzahl von Threads erstellen, erstellen Sie diese selbst. Wenn Sie im Voraus nicht bestimmen können, wie viele Threads möglicherweise erstellt werden (z. B. als Reaktion auf eingehende E / A), und ihre Arbeit nur von kurzer Dauer ist, verwenden Sie den Threadpool. Wenn Sie nicht wissen, wie viele, aber ihre Arbeit wird lange dauern, gibt es auf der Plattform nichts, was Ihnen helfen könnte - aber Sie können möglicherweise alternative Threadpool-Implementierungen finden, die passen.
quelle
ebenfalls
erzeugt einen Vordergrund-Thread, der nicht stirbt, wenn Sie Ihr Programm schließen. ThreadPool-Threads sind Hintergrund-Threads, die beim Schließen der App absterben.
quelle
Ich war neugierig auf die relative Ressourcennutzung für diese und führte einen Benchmark auf meinem 2012 Dual-Core-Intel i5-Laptop mit .net 4.0-Release auf Windows 8 durch. Thread-Pools dauerten durchschnittlich 0,035 ms, um dort zu starten, wo Threads durchschnittlich 5,06 nahmen Frau. Mit anderen Worten, der Thread im Pool wurde für eine große Anzahl kurzlebiger Threads etwa 300-mal schneller gestartet. Zumindest in den getesteten Threads (100-2000) schien die Gesamtzeit pro Thread ziemlich konstant zu sein.
Dies ist der Code, der bewertet wurde:
quelle
Hier finden Sie einen früheren Thread:
Wann sollte ich den ThreadPool nicht in .Net verwenden?
Zusammenfassung ist, dass Threadpool gut ist, wenn Sie viele kurzlebige Threads erzeugen müssen, während die Verwendung von Threads Ihnen etwas mehr Kontrolle gibt.
quelle
Lokaler Thread-Speicher ist bei Thread-Pools keine gute Idee. Es gibt Threads eine "Identität"; Nicht mehr alle Threads sind gleich. Jetzt sind Thread-Pools besonders nützlich, wenn Sie nur eine Reihe identischer Threads benötigen, die bereit sind, Ihre Arbeit ohne Erstellungsaufwand zu erledigen.
quelle
Wenn Sie viele Threads benötigen, möchten Sie wahrscheinlich einen ThreadPool verwenden. Sie verwenden Threads wieder, wodurch Sie den Aufwand für die Thread-Erstellung sparen.
Wenn Sie nur einen Thread benötigen, um etwas zu erledigen, ist Thread wahrscheinlich am einfachsten.
quelle
Der Hauptbedarf für Theadpool-Threads besteht darin, kurze kleine Aufgaben zu erledigen, von denen erwartet wird, dass sie fast sofort erledigt werden. Hardware-Interrupt-Handler werden häufig in einem Stapelkontext ausgeführt, der nicht für Nicht-Kernel-Code geeignet ist. Ein Hardware-Interrupt-Handler kann jedoch feststellen, dass ein Rückruf zum Abschluss der E / A im Benutzermodus so bald wie möglich ausgeführt werden sollte. Das Erstellen eines neuen Threads zum Ausführen eines solchen Dings wäre ein massiver Overkill. Es ist viel effizienter, einige vorab erstellte Threads zu haben, die zum Ausführen von E / A-Abschlussrückrufen oder ähnlichen Dingen gesendet werden können.
Ein Schlüsselaspekt solcher Threads ist, dass, wenn E / A-Abschlussmethoden immer im Wesentlichen sofort abgeschlossen werden und niemals blockiert werden und die Anzahl solcher Threads, auf denen solche Methoden derzeit ausgeführt werden, mindestens der Anzahl der Prozessoren entspricht, der einzige Weg für jeden anderen Thread ist könnte ausgeführt werden, bevor eine der oben genannten Methoden beendet ist, wenn eine der anderen Methoden blockiert oder ihre Ausführungszeit eine normale Threading-Zeitscheibe überschreitet; Beides sollte nicht sehr oft vorkommen, wenn der Thread-Pool wie vorgesehen verwendet wird.
Wenn nicht erwartet werden kann, dass eine Methode innerhalb von etwa 100 ms nach Beginn der Ausführung beendet wird, sollte die Methode auf andere Weise als über den Hauptthreadpool ausgeführt werden. Wenn viele Aufgaben ausgeführt werden müssen, die CPU-intensiv sind, aber nicht blockiert werden, kann es hilfreich sein, sie mithilfe eines Pools von Anwendungsthreads (einer pro CPU-Kern) zu versenden, der seit der Verwendung vom "Haupt" -Threadpool getrennt ist Mehr Threads als Kerne sind kontraproduktiv, wenn nicht blockierende CPU-intensive Aufgaben ausgeführt werden. Wenn die Ausführung einer Methode jedoch eine Sekunde oder länger dauert und die meiste Zeit blockiert ist, sollte die Methode wahrscheinlich in einem dedizierten Thread ausgeführt werden und mit ziemlicher Sicherheit nicht in einem Haupt-Threadpool-Thread. Wenn ein lang laufender Vorgang durch einen E / A-Rückruf ausgelöst werden muss,
quelle
Im Allgemeinen (ich habe .NET noch nie verwendet) wird ein Thread-Pool für Ressourcenverwaltungszwecke verwendet. Hiermit können Einschränkungen in Ihrer Software konfiguriert werden. Dies kann auch aus Leistungsgründen erfolgen, da das Erstellen neuer Threads kostspielig sein kann.
Es kann auch systemspezifische Gründe geben. In Java (wieder weiß ich nicht, ob dies für .NET gilt) kann der Manager der Threads threadspezifische Variablen anwenden, wenn jeder Thread aus dem Pool gezogen wird, und sie deaktivieren, wenn sie zurückgegeben werden (übliche Methode, um so etwas zu übergeben eine Identität).
Beispieleinschränkung: Ich habe nur 10 Datenbankverbindungen, daher würde ich nur 10 Arbeitsthreads für den Zugriff auf die Datenbank zulassen.
Dies bedeutet nicht, dass Sie keine eigenen Threads erstellen sollten, aber es gibt Bedingungen, unter denen es sinnvoll ist, einen Pool zu verwenden.
quelle
Die Verwendung eines Pools ist eine gute Idee, wenn Sie nicht wissen oder nicht steuern können, wie viele Threads erstellt werden.
Haben Sie nur ein Problem mit einem Formular, das einen Thread verwendet, um ein Feld aus einer Datenbank bei einem Ereignis mit Positionsänderung eines Listensteuerelements zu aktualisieren (Einfrieren vermeiden). Es dauerte 5 Minuten, bis mein Benutzer einen Fehler in der Datenbank hatte (zu viele Verbindungen mit Access), weil er die Listenposition zu schnell änderte ...
Ich weiß, dass es eine andere Möglichkeit gibt, das Basisproblem zu lösen (einschließlich der Nichtverwendung des Zugriffs), aber Pooling ist ein guter Anfang.
quelle
Thread :
Thread-Pool :
quelle