Ich versuche, einen Pool von Arbeitern in Go zu implementieren. Der Abschnitt go-wiki (und Effektiv Go in den Channels) enthält 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!Idiomatische Variable-Size-Worker-Pool in Go
Alternativ könnte man beim Senden in den Kanal blockieren, aber gleiche Idee.
Meine Frage ist über die Größe des Worker-Pools ändern, während es ausgeführt wird. 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. This page implementiert tatsächlich ein Semaphor mit einem Kanal und leere Strukturen in etwa die gleiche Weise, aber es hat das gleiche Problem (diese Dinge kommen die ganze Zeit beim googeln für "golang Semaphor".
Warum möchten Sie einen Worker Pool mit variabler Größe haben? – fabrizioM
@fabrizioM Die Arbeiter machen sehr wenig für sich - sie kontrollieren wirklich nur einige externe Prozesse. Die Anzahl der Arbeiter sollte von der Last der Maschinen mit den externen Prozessen und anderen Faktoren abhängen (z. B. Priorität einer Art von Arbeit gegenüber einer anderen). – Hut8
In diesem Fall sollten Sie idealerweise einen anderen Mechanismus als einen Pool mit einstellbarer Größe verwenden, um dies zu tunen. Sie könnten zum Beispiel eine goroutine starten, die den Arbeitsspeicher oder die Auslastung einer Zielmaschine überprüft, und eine Aufgabe starten, wenn die Maschine bereit ist, und eine weitere Prüfung einplanen, wenn nicht. Ich weiß natürlich nicht, was funktioniert, da ich nicht wirklich weiß, was Sie bauen. – twotwotwo