Ich versuche einen Pool von Arbeitern in Go zu implementieren. Der go-wiki (und der Effektive Go-Kanal im Abschnitt "Channels") bieten hervorragende Beispiele für die Verwendung von Ressourcen . Erstellen Sie einfach einen Kanal mit einem Puffer, der so groß ist wie der Worker-Pool. Fülle dann diesen Kanal mit Arbeitern und schicke sie zurück in den Kanal, wenn sie fertig sind. Empfangen von den Kanalblöcken, bis ein Mitarbeiter verfügbar ist. Also der Kanal und eine Schleife ist die gesamte Implementierung - sehr cool!
Alternativ könnte man beim Senden in den Kanal blockieren, aber gleiche Idee.
Bei meiner Frage geht es darum, die Größe des Worker-Pools während der Ausführung zu ändern. Ich glaube nicht, dass es einen Weg gibt, die Größe eines Kanals zu ändern. Ich habe einige Ideen, aber die meisten scheinen viel zu kompliziert. Diese Seite implementiert tatsächlich einen Semaphor, der einen Kanal und leere Strukturen auf die gleiche Weise verwendet, aber es hat das gleiche Problem (diese Beim googeln nach "golang semaphore" tauchen immer wieder Dinge auf.
Ich würde es andersherum machen. Anstatt viele Goroutines hervorzubringen (die immer noch eine beträchtliche Menge an Speicher benötigen) und einen Kanal zu benutzen, um sie zu blockieren, würde ich die Arbeiter als Göroutines modellieren und einen Kanal benutzen, um die Arbeit zu verteilen. Etwas wie das:
%Vor% Es könnte eine gute Idee sein, einen separaten WorkerPool-Typ mit einigen bequemen Methoden zu erstellen. Anstelle von type Task string
ist es üblich, eine Struktur zu verwenden, die auch einen done
-Kanal enthält, der verwendet wird, um anzuzeigen, dass die Aufgabe erfolgreich ausgeführt wurde.
Edit: Ich habe ein bisschen mehr herumgespielt und folgendes gefunden: Ссылка . Es ist im Grunde das gleiche Beispiel, mit einer schöneren API.
Eine einfache Änderung, die denken kann, ist ein Kanal, der steuert, wie groß der Semaphor ist. Der relevante Teil sind die Select-Anweisungen. Wenn es mehr Arbeit von der Warteschlange gibt, verarbeiten Sie sie mit dem aktuellen Semaphor. Wenn eine Anforderung zum Ändern der Größe des Semaphors vorliegt, ändern Sie sie und fahren Sie mit dem neuen Semaphor fort, die req-Warteschlange zu verarbeiten. Beachten Sie, dass der alte Müll gesammelt wird.
%Vor%Tags und Links concurrency go goroutine worker-process semaphore