Vom Go FAQ:
Warum nicht Multi-goroutine Programm verwenden, um mehrere CPUs?
Sie müssen die Shell-Umgebungsvariable GOMAXPROCS festlegen oder die gleichnamige Funktion des Laufzeitpakets verwenden, damit die Laufzeitunterstützung mehr als einen Betriebssystemthread verwenden kann.
Programme, die eine parallele Berechnung durchführen, sollten von einer Erhöhung von GOMAXPROCS profitieren. Beachten Sie jedoch, dass Parallelität keine Parallelität ist.
(UPDATE 2015.08.28: Go 1.5 gesetzt, um den Standardwert von GOMAXPROCS die gleiche wie die Anzahl der CPUs auf dem Computer zu machen, so sollte dies kein Problem mehr sein)
Und
Warum macht die Verwendung von GOMAXPROCS> 1 manchmal mein Programm langsamer?
Es hängt von der Art Ihres Programms ab. Probleme, die an sich sequentiell sind, können nicht durch Hinzufügen weiterer Gatorutins beschleunigt werden. Parallelität wird nur dann zur Parallelität, wenn das Problem intrinsisch parallel ist.
In der Praxis werden Programme, die mehr Zeit mit der Kommunikation auf Kanälen als mit Berechnungen verbringen, bei der Verwendung mehrerer Betriebssystem-Threads zu Leistungseinbußen kommen. Dies liegt daran, dass das Senden von Daten zwischen Threads einen Wechsel von Kontexten erfordert, was erhebliche Kosten verursacht. Zum Beispiel hat das Prime-Sieb-Beispiel aus der Go-Spezifikation keine signifikante Parallelität, obwohl es viele Goroutines startet; Das Erhöhen von GOMAXPROCS verlangsamt es eher als es zu beschleunigen.
Go's Goroutine Scheduler ist nicht so gut wie es sein muss. In Zukunft sollte es solche Fälle erkennen und seine Verwendung von OS-Threads optimieren. Vorläufig sollte GOMAXPROCS für jede Anwendung festgelegt werden.
Kurz gesagt: Es ist sehr schwierig, Go "effiziente Nutzung aller Ihrer Kerne" zu machen. Einfach eine Milliarde Goroutines hervorzubringen und GOMAXPROCS zu erhöhen, ist genauso wahrscheinlich, Ihre Leistung zu verschlechtern, als es zu beschleunigen, weil es Gewindekontexte die ganze Zeit wechseln wird. Wenn Sie ein großes Programm haben, das parallelisierbar ist, dann funktioniert es gut, GOMAXPROCS auf die Anzahl paralleler Komponenten zu erhöhen. Wenn Sie ein paralleles Problem in ein weitgehend nicht paralleles Programm eingebettet haben, kann es schneller werden, oder Sie müssen möglicherweise Funktionen wie runtime.LockOSThread() kreativ nutzen, um sicherzustellen, dass die Laufzeitumgebung alles korrekt verteilt (in der Regel wird Go nur dumpf gespreizt) derzeit nicht blockierende Goroutines willkürlich und gleichmäßig unter allen aktiven Threads).
Auch GOMAXPROCS ist die Anzahl der CPU-Kerne zu verwenden, wenn es größer ist als NumCPU Ich bin ziemlich sicher, dass es einfach an NumCPU klemmt. GOMAXPROCS entspricht nicht unbedingt der Anzahl der Threads. Ich bin nicht 100% ig sicher, wann genau die Laufzeit entscheidet, neue Threads zu erzeugen, aber eine Instanz ist, wenn die Anzahl der blockierenden goroutines mit runtime.LockOSThread() größer oder gleich GOMAXPROCs ist - es wird mehr Threads als Kerne erzeugen Damit kann der Rest des Programms ordnungsgemäß ausgeführt werden.
Grundsätzlich ist es ziemlich einfach, GOMAXPROCS zu erhöhen und verwenden alle Kerne Ihrer CPU zu machen. Es ist eine andere Sache an dieser Stelle in Go's Entwicklung, es tatsächlich zu Smart smart und effizient alle Kerne Ihrer CPU zu bekommen, die eine Menge Programm-Design und Finling erfordern, um richtig zu machen.
Ihr vorletzter Absatz scheint falsch zu sein. http://golang.org/pkg/runtime/ –
Ich weiß, was Laufzeit sagt, ich anders hier gesagt wurde: https://groups.google.com/forum/#!topic/golang-nuts/z_7F6EpcCLY Vielleicht hängt es von der Implementierung ab? – LinearZoetrope
Ah! Das ist ein nützlicher Thread. "Es gibt ein Argument dafür, dass der Go-Scheduler immer einen Ersatzthread für kurzfristige Anfragen bereithält.Wenn keine laufende goroutine die Kontrolle in den letzten N Millisekunden aufgegeben hat, führen Sie einen neuen Thread aus, anstatt auf zu warten, damit die compute-gebundenen beendet werden. Ein Thread pro CPU ist keine gute Regel, wenn es compute-gebundene Aufgaben gibt. "Also, ein paar überschüssige Threads wäre in diesem Fall ratsam. –