Ich verstehe, dass goroutines auf mehrere OS-Threads gemultiplext sind. Wenn also einer blockiert wird, etwa während ich auf I / O warte, laufen andere weiter. Aber gibt es eine Möglichkeit, im Voraus zu wissen, wie viele Threads ich erzeugen würde, wenn ich n goroutines erstellen würde?
Wenn wir beispielsweise die folgende Funktion aufrufen, würden wir wissen, wie viele (oder die maximale Anzahl) Systemthreads für n goroutines erstellt würden:
%Vor%Laut Pike Go Kurs PDF Folien (Tag 3):
... Wenn Sie eine Parallelisierung auf Benutzerebene wünschen, müssen Sie
$GOMAXPROCS
oderruntime.GOMAXPROCS(n)
angeben.GOMAXPROCS
teilt dem Laufzeitplaner mit, wie viele nicht syscall-blockierte Gloutinen gleichzeitig ausgeführt werden.
Auf der Grundlage diesem Blogpost würde es auch scheinen, die Mit der Umgebungsvariablen GOMAXPROCS
können Sie die Anzahl der Threads festlegen. Ich bin mir nicht sicher, wie ich die Standardanzahl von Threads ermitteln kann, die von der Laufzeitumgebung verwaltet werden, wenn Sie diesen Wert jedoch nicht angeben.
Dieser Blogpost scheint zu implizieren, dass wenn Wenn Sie die Umgebungsvariable nicht setzen, wird die Laufzeit nur einen Kern verwenden (vermutlich weil sie nur einen Prozess verwendet).
Jede Goroutine kann maximal einen Thread gleichzeitig verwenden. Ob es einen Thread verwendet oder nicht, hängt davon ab, was es tut. Der Wert von GOMAXPROCS bestimmt die Anzahl der Threads, die durch frei laufenden Go-Code verwendet werden können - mit anderen Worten, der maximale Grad an Parallelität.
Es können jedoch mehr Threads verwendet werden, sogar mit GOMAXPROCS = 1, wenn G-Aufrufe direkt bei Systemaufrufen oder C-Aufrufe blockieren.
Die folgenden Operationen bewirken nicht , dass die Goroutine beim Blockieren einen Thread verwendet:
Dies bedeutet zum Beispiel, dass wenn Sie viele goroutines haben, die / dev / ttyxx öffnen und beim Lesen blockieren, Sie einen Thread für jeden verwenden. Dasselbe gilt, wenn Sie eine Menge Prozesse ausführen und darauf warten, dass sie beendet werden.
Gegenwärtig erstellt gccgo einen Thread pro Goroutine.
Ich weiß nicht über 6g.