Ich baue eine Golang App, die einen "Worker Pool" von Goroutines verwendet, anfänglich starte ich den Pool und erstelle eine Anzahl von Arbeitern. Ich habe mich gefragt, wie die optimale Anzahl von Arbeitern in einem Multi-Core-Prozessor wäre, zum Beispiel in einer CPU mit 4 Kernen? Ich verwende derzeit die folgenden aproach:optimale Größe von Golang Worker Pool
// init pool
numCPUs := runtime.NumCPU()
runtime.GOMAXPROCS(numCPUs + 1) // numCPUs hot threads + one for async tasks.
maxWorkers := numCPUs * 4
jobQueue := make(chan job.Job)
module := Module{
Dispatcher: job.NewWorkerPool(maxWorkers),
JobQueue: jobQueue,
Router: router,
}
// A buffered channel that we can send work requests on.
module.Dispatcher.Run(jobQueue)
Die vollständige Implementierung ist unter
job.NewWorkerPool (maxWorkers) und module.Dispatcher.Run (Jobqueue)
Mein Anwendungsfall für die Verwendung eines Worker-Pools: Ich habe einen Dienst, der Anfragen akzeptiert und mehrere externe APIs aufruft und deren Ergebnisse in einer einzigen Antwort aggregiert. Jeder Aufruf kann unabhängig von anderen erfolgen, da die Reihenfolge der Ergebnisse keine Rolle spielt. Ich gebe die Aufrufe an den Worker-Pool ab, wo jeder Aufruf in einer verfügbaren Goroutine asynchron erfolgt. Mein Thread "request" überwacht weiterhin die Rückkanäle, während Ergebnisse abgerufen und aggregiert werden, sobald ein Worker-Thread ausgeführt wird. Wenn alle fertig sind, wird das endgültige aggregierte Ergebnis als Antwort zurückgegeben. Da jeder externe API-Aufruf variable Antwortzeiten darstellen kann, können einige Aufrufe früher als andere beendet werden. Nach meinem Verständnis wäre es in Bezug auf die Leistung besser, als ob es im Vergleich zu synchronen Aufruf jeder externen API hintereinander wäre.
Es gibt keine objektive Antwort darauf. Es hängt ganz davon ab, was Sie mit Ihren Mitarbeitern machen und welche Leistungsmerkmale Sie anstreben. Wenn Ihre Mitarbeiter E/A-gebunden sind (z. B. ein HTTP- oder SMTP-Server), könnten Sie möglicherweise 1.000 Mitarbeiter auf einem einzelnen CPU-Rechner behandeln. Wenn sie CPU-gebunden sind, sehen Sie möglicherweise keinen Vorteil mehr als einen Arbeiter pro CPU. – Flimzy
Es gibt auch keinen Grund, 'GOMAXPROCS' in 99,99% der modernen Go-Anwendungen zu setzen. Und es auf NUM CPUs + 1 zu setzen macht nie Sinn, AFAIK. Sie sollten dies nur festlegen, wenn Sie den Standardwert reduzieren möchten. – Flimzy
Es hängt davon ab, welche Art von Problem Sie lösen (CPU-gebunden oder anders), und das Leben jeder Ihrer Aufgaben, die der Worker-Thread behandeln wird. Sie müssen ein paar Zahlen ausprobieren, Benchmarks und sehen, was am besten für Ihren Anwendungsfall funktioniert. – Ravi