Kannst du erkennen, wie viele Threads eine bestimmte Anzahl von Goroutines erstellt?

8

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%     
Brad The App Guy 11.11.2009, 09:46
quelle

3 Antworten

7

Laut Pike Go Kurs PDF Folien (Tag 3):

  

... Wenn Sie eine Parallelisierung auf Benutzerebene wünschen, müssen Sie $GOMAXPROCS oder runtime.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).

    
fbrereto 12.11.2009, 23:38
quelle
6

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.

    
rog 25.05.2012 11:55
quelle
3

Gegenwärtig erstellt gccgo einen Thread pro Goroutine.

Ich weiß nicht über 6g.

    
György Andrasek 11.11.2009 13:57
quelle

Tags und Links