Wie würde man einen Threadpool implementieren? Ich habe auf Wikipedia nach „Threadpool“ gelesen, kann aber immer noch nicht herausfinden, was man tun soll, um diese Frage zu lösen (möglicherweise, weil ich nicht ganz verstanden habe, was ein Threadpool in einfachen Worten ist).
Kann mir jemand im Klartext erklären, was ein Threadpool ist und wie man diese Frage beantworten würde?
Antwort
Ein Thread Pool ist eine Gruppe von vorinstanzierten, inaktiven Threads, die für die Arbeit bereit sind. Diese werden der Instanziierung neuer Threads für jede Aufgabe vorgezogen, wenn eine große Anzahl von kurzen Aufgaben zu erledigen ist, anstatt eine kleine Anzahl von langen. Dadurch wird vermieden, dass der Aufwand für das Erstellen eines Threads häufig anfällt.
Die Implementierung variiert je nach Umgebung. Vereinfacht ausgedrückt benötigen Sie jedoch Folgendes:
- Eine Möglichkeit, Threads zu erstellen und sie im Ruhezustand zu halten. Dies kann erreicht werden, indem jeder Thread an einer Barriere wartet, bis der Pool seine Arbeit erledigt. (Dies kann mit Mutexen erfolgen auch.)
- Ein Container zum Speichern der erstellten Threads, z. B. eine Warteschlange oder eine andere Struktur, mit der Sie dem Pool einen Thread hinzufügen und einen herausziehen können.
- Eine Standardschnittstelle oder abstrakte Klasse, die die Threads bei der Arbeit verwenden können. Dies kann eine abstrakte Klasse namens
Task
mit einerexecute()
-Methode sein, die die Arbeit erledigt und dann zurückgibt.
Wenn der Thread-Pool erstellt wird, wird entweder eine bestimmte Anzahl von Threads instanziiert, um sie verfügbar zu machen, oder je nach Bedarf neue Threads erstellt.
Wenn dem Pool ein Task
, es nimmt einen Thread aus dem Container (oder wartet darauf, dass einer verfügbar wird, wenn der Container leer ist), gibt ihm einen Task
, und trifft die Barriere. Dies führt dazu, dass der inaktive Thread die Ausführung fortsetzt und die Methode execute()
der angegebenen Task
aufruft. Sobald die Ausführung abgeschlossen ist, gibt sich der Thread an den Pool zurück, um ihn zur Wiederverwendung in den Container zu legen, und trifft dann auf seine Barriere, um sich in den Ruhezustand zu versetzen, bis sich der Zyklus wiederholt.
Kommentare
- Ein Thread-Pool ist eine Gruppe von vorinstanziierten, inaktiven Threads, die bereit sind, Arbeit zu leisten. […] Dies verhindert, dass der Aufwand für das Erstellen eines Threads häufig anfällt. – Dies sollte von Google gespuckt werden, wenn jemand nach “ -Thread sucht Pool “
- Enthält die Erstellung des Thread-Pools eine interne Barriere? Können Sie in diesen Zeilen Verweise teilen?
- @overexchange Nein, das ist nicht der Fall. Mein Verweis auf diese Frage war ein Beispiel für eine bessere Möglichkeit, Ihre Barrierefrage neu zu schreiben. (Wenn Sie dies tun, werde ich eine Antwort schreiben.)
- eine der besten kurzen Antworten.
Antwort
Thread-Pool ist eine Sammlung verwalteter Threads, die normalerweise in einer Warteschlange organisiert sind und die Aufgaben in der Aufgabenwarteschlange ausführen.
Das Erstellen eines neuen Thread-Objekts jedes Mal, wenn etwas asynchron ausgeführt werden muss, ist teuer. In einem Thread-Pool würden Sie nur die Aufgaben, die asynchron ausgeführt werden sollen, zur Aufgabenwarteschlange hinzufügen, und der Thread-Pool sorgt dafür, dass der entsprechenden Aufgabe gegebenenfalls ein verfügbarer Thread zugewiesen wird. Sobald die Aufgabe abgeschlossen ist, fordert der jetzt verfügbare Thread eine andere Aufgabe an (vorausgesetzt, es ist noch etwas übrig).
Mit dem Thread-Pool können Sie vermeiden, dass mehr Threads erstellt oder zerstört werden, als tatsächlich erforderlich wären.
Ich würde zunächst eine Klasse mit einer Warteschlange von Threads und einer Warteschlange von Aufgaben erstellen. Implementieren Sie dann eine Methode, die der Aufgabenwarteschlange eine Aufgabe hinzufügt, und fahren Sie von dort fort. Natürlich sollten Sie auch die Möglichkeit haben, die maximal zulässigen Threads in einem Thread-Pool festzulegen.
Antwort
Beispiel aus dem wirklichen Leben;
- Einrichtung: Betriebssystem
- Abschnitte: Anwendungen
- Personen: Threads
Sie haben dort eine Einrichtung 12 Leute arbeiten. Es gibt 3 Abschnitte dieser Einrichtung. Küche, Toiletten und Sicherheit. Wenn Sie keine Thread-Pool-Technik verwenden, funktioniert dies folgendermaßen: Alle 12 Personen stehen in einem Besprechungsraum. Wenn neue Kunden in der Einrichtung vorbeikommen und nach Aufgaben fragen, trennen Sie die Personen in Gruppen und senden sie an ihre Arbeit und kehren in den Besprechungsraum zurück. Aber bevor sie zu ihrem Dienst gehen, gibt es eine Vorbereitungsphase. Sie müssen die richtige Uniform tragen, bestimmte Geräte ausrüsten und zu diesem Abschnitt gehen, die Arbeit beenden und zurückkommen. Also einmal Jedes Mal, wenn sie ihren Job beenden (Thread endet), müssen sie zurück zum Besprechungsraum gehen, die Uniform ausziehen, die Ausrüstung herausnehmen und auf den nächsten Job warten. Diese beziehen sich auf das Erstellen des Thread-Kontexts, die Speicherzuweisung und das Verfolgen von Informationen nach Betriebssystem.Es ist zu zeitaufwändig für das Betriebssystem, neue Thread-Anforderungen neu zu organisieren.
Wenn Sie Thread-Pooling verwenden, weisen Sie am frühen Morgen 6 Personen der Küche, 2 Personen der Toilette und zu 4 Personen zur Sicherheit. Sie bereiten sich also nur einmal am Tag vor. Selbst wenn keine Kunden in der Küche sind, sind diese 4 Personen im Leerlauf für alle anstehenden Aufgaben da. Sie müssen nicht in den Besprechungsraum zurückkehren, bis die Küche geschlossen ist (App endet). Diese 4 Personen befinden sich im Küchen-App-Pool und sind bereit, schnell zu dienen. Sie können jedoch nicht versprechen, dass sie den ganzen Tag arbeiten, da die Küche von Zeit zu Zeit leer sein kann. Die gleiche Logik gilt auch für Toiletten und Sicherheit.
Im ersten Szenario verschwenden Sie keinen Thread für eine Aufgabe, ABER es wird viel Zeit in Anspruch nehmen, jeden einzelnen Thread für jede Aufgabe vorzubereiten. Im zweiten Fall bereiten Sie Threads im Voraus vor, sodass Sie nicht garantieren können, dass Sie alle Threads für alle Aufgaben verwenden. Das Betriebssystem optimiert sie jedoch größtenteils, sodass Sie sich sicher darauf verlassen können.
Antwort
In Multithread-Anwendungen ist der Thread-Pool ein „Pool verfügbarer Threads“, der von Ihrer Anwendung verwendet werden kann. Normalerweise, z. In .NET wird alles verwaltet, sodass Sie nur Aufgaben zuweisen. Sobald ein Thread frei ist, wird er ausgeführt. Um einen Threadpool zu implementieren, würde ich erwarten, ein Konzept zu erstellen, bei dem Aufgaben automatisch von freien Threads ohne explizite Thread-Erstellung für jede Aufgabe übernommen werden.