Frage

Was ist der Unterschied zwischen einem neuen Thread mit und einen Thread aus dem Threadpool verwenden? Welche Leistungsvorteile gibt es und warum sollte ich mit einem Thread aus dem Pool betrachten, anstatt einen habe ich explizit erstellt? Ich denke hier speziell von .NET, aber allgemeine Beispiele sind in Ordnung.

War es hilfreich?

Lösung

Thread-Pool wird Vorteile für die häufigen und relativ kurze Operationen durch

  • Wiederverwenden von Threads, die bereits erstellt wurden, anstatt neue zu schaffen (ein teurerer Prozess)
  • Die Drosselung der Geschwindigkeit der Thread-Erzeugung, wenn es einen Ausbruch von Anfragen für neue Workitems ist (ich glaube, das ist nur in .NET 3.5 ist)

    • Wenn Sie 100-Thread-Pool Aufgaben Warteschlange, es wird nur so viele Threads verwenden, wie bereits erstellt wurde diese Anforderungen zu bedienen (etwa 10 zum Beispiel). Der Thread-Pool wird häufige Kontrollen machen (ich alle 500 ms in 3.5 SP1 glauben), und wenn es Aufgaben in die Warteschlange gestellt, es wird ein neuer Thread machen. Wenn Sie Ihre Aufgaben schnell sind, dann wird die Anzahl der neuen Threads klein sein und den 10 Wiederverwendung oder so Threads für die kurzen Aufgaben wird schneller sein als die Schaffung von 100 Fäden vorne.

    • Wenn Sie Ihre Arbeitsbelastung konsequent eine große Anzahl von Thread-Pool-Anfragen hat auf sich warten, dann wird der Thread-Pool Wille stimmen sich auf Ihre Arbeitsbelastung von mehr Threads im Pool nach dem obigen Verfahren zu schaffen, so dass es eine größere Anzahl von Gewinde zur Verfügung zu Prozessanforderungen

    • überprüfen

Andere Tipps

Die verwalteten .NET-Threadpool: -

  • Größen sich auf Basis der aktuellen Auslastung und verfügbare Hardware
  • Enthält Worker-Threads und Completion-Port-Threads (die IO speziell verwendet werden, um Service)
  • Ist für eine große Anzahl von relativ kurzer Dauer Operationen optimiert

Andere Thread-Pool-Implementierungen gibt, die möglicherweise für lang laufende Operationen besser geeignet sein.

Im Einzelnen einen Thread-Pool verwenden, um Ihre App von der Erstellung zu viele Fäden zu verhindern. Das wichtigste Merkmal eines Threadpool ist die Arbeitsschlange. Das heißt, sobald das Gerät ausreichend besetzt ist, wird der Thread Anforderungen in einer Warteschlange, anstatt sofort mehr Threads erzeugen.

Wenn Sie also eine kleine, begrenzte Anzahl von Threads schaffen schaffen sie selbst. Wenn Sie nicht up-front, wie viele Threads bestimmen könnten geschaffen werden (z sie in Reaktion auf eingehende IO erstellt), und ihre Arbeit wird von kurzer Dauer sein, verwenden Sie den Threadpool. Wenn Sie nicht wissen, wie viele, aber ihre Arbeit wird mit langer Laufzeit sein, es gibt nichts in der Plattform, Ihnen zu helfen -. Aber Sie könnten in der Lage sein, alternative Implementierungen Threadpool zu finden, die passen

auch

  

new Thread().Start()

laicht Vordergrund Thread, der nicht sterben wird, wenn Sie Ihr Programm schließen. Threadpool Threads Hintergrund-Threads, die sterben, wenn Sie die App zu schließen.

Überprüfen Sie hier für einen früheren Thread:

Wann soll ich nicht den Threadpool in .NET verwenden?

Zusammenfassung ist, dass Thread gut, wenn man viele kurzlebige Threads erstellen, müssen, während Threads gibt Ihnen ein bisschen mehr Kontrolle.

Thread lokale Speicher sind keine gute Idee, mit Thread-Pools. Es gibt Themen eine „Identität“; nicht alle Themen sind nicht mehr gleich. Jetzt sind Thread-Pools besonders nützlich, wenn Sie nur ein paar identischen Fäden benötigen, bereit, Ihre Arbeit ohne Schöpfung Aufwand zu tun.

Wenn Sie eine Menge von Threads benötigen, wollen Sie wahrscheinlich einen Threadpool verwenden. Sie wiederverwenden Fäden der Systemaufwand für Thread-Erzeugung zu speichern.

Wenn Sie nur einen Thread brauchen etwas getan, Thema ist wahrscheinlich am einfachsten.

Der primäre Bedarf an theadpool Threads ist kurz kleine Aufgaben zu bewältigen, die fast sofort abgeschlossen werden erwartet. Hardware-Interrupt-Handler laufen oft in einem Stapelkontext, die für Nicht-Kernel-Code nicht geeignet wäre, sondern ein Hardware-Interrupt-Handler können feststellen, dass ein User-Mode-I / O-Abschluss Rückruf sollte so schnell wie möglich ausgeführt werden. so etwas laufen würde massiv übertrieben einen neuen Thread zu dem Zweck zu schaffen. einige bereits erstellten Fäden, die I / O-Abschluss Rückrufe oder andere ähnliche Dinge ist viel effizienter.

Versandfähige laufen

Ein wesentlicher Aspekt solcher Fäden ist, dass, wenn E / A-Abschlussverfahren abzuschließen immer im wesentlichen augenblicklich und niemals blockieren, und die Anzahl dieser Fäden, die derzeit solche Verfahren ist mindestens gleich die Anzahl von Prozessoren ausgeführt werden, der einzige Weg, anderer Faden vor einem des oben genannten Verfahren laufen kann beendet wäre, wenn einer der anderen Methoden Blöcke oder ihre Ausführungszeit, eine normale Einfädeln Zeitscheibe überschreitet; keiner von denen sollte sehr oft passieren, wenn der Thread-Pool verwendet wird, wie vorgesehen.

Wenn eine Methode nicht erwartet werden kann, innerhalb von 100 ms verlassen oder so, wenn er mit der Ausführung beginnt, soll das Verfahren über einige Mittel ausgeführt werden, um andere als der Haupt-Thread-Pool. Wenn man viele Aufgaben zu erfüllen hat, die sind CPU-intensiv, aber nicht blockieren, kann es hilfreich sein, sie zu versenden, einen Pool von Anwendungs-Threads verwenden (einen pro CPU-Kern), die von dem „main“ Thread getrennt ist, da mit mehr Threads als Kern werden kontraproduktiv sein, wenn nicht-blockierende CPU-intensive Aufgaben ausgeführt werden. Wenn jedoch dauert ein Verfahren zur Herstellung eine Sekunde oder länger auszuführen, und die meiste Zeit blockiert verbringen, sollte das Verfahren wahrscheinlich in einem eigenen Thread ausgeführt werden und sollte an Sicherheit grenzender Wahrscheinlichkeit nicht in einem Haupt-Threadpool-Thread ausgeführt werden. Wenn eine lang andauernde Operation durch so etwas wie ein E / A-Rückruf ausgelöst werden muss, sollte man entweder ein Gewinde für die lang andauernde Operation im Vorfeld des Rückrufs starten und es auf einem Monitor warten, die die Callback-Impulse, sonst haben die Callback einen neuen Thread starten den Betrieb, während die Callback-Ausgänge, effektiv einen eigenen Thread zum thread~~POS=TRUNC Rückkehr auszuführen.

In der Regel (I nie .NET verwendet haben), wäre ein Thread-Pool für das Ressourcenmanagement Zwecke nutzen. Es ermöglicht Einschränkungen in der Software konfiguriert werden. Es kann auch aus Leistungsgründen erfolgen, wie Schaffung neuer Threads kostspielig sein kann.

Es kann auch systemspezifische Gründe. In Java (wieder weiß ich nicht, ob dies zu .NET gilt), kann der Manager des Gewinde Thread spezifische Variablen gelten als jeder Thread aus dem Pool gezogen wird, und sie unset wenn sie zurückgebracht (gemeinsamen Weg, um etwas passieren eine Identität).

Beispiel Einschränkung: Ich habe nur 10 db Verbindungen, also würde ich nur 10 Worker-Threads ermöglichen, die Datenbank für den Zugriff.

Das bedeutet nicht, dass Sie Ihre eigenen Threads nicht schaffen sollten, aber es gibt Bedingungen, unter denen es sinnvoll ist, einen Pool zu nutzen.

Mit einem Pool ist eine gute Idee, wenn Sie nicht wissen, oder können nicht steuern, wie vielen Thread erstellt werden.

hat nur ein Problem mit einem Formular Thread mit einigem Feld auf einer Position Fall einer Listensteuerung aus einer Datenbank zu aktualisieren (vermeiden freez). Es dauerte 5 Minuten für meine Benutzer einen Fehler aus der Datenbank haben (zu viele Zusammenhang mit Access), weil er die Listenposition Wechsel zu schnell ...

Ich weiß, dass es andere Art und Weise ist das Basisproblem (einschließlich nicht Zugang) zu lösen, aber die Bündelung ist ein guter Anfang.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top