Können Sie feststellen, wie viele Themen eine bestimmte Anzahl von Goroutinen erzeugen werden?

StackOverflow https://stackoverflow.com/questions/1714136

  •  19-09-2019
  •  | 
  •  

Frage

Ich verstehe, dass Goroutines auf mehreren Betriebssystemfäden multiplexiert sind. Wenn man also blockieren sollte, z. Aber gibt es eine Möglichkeit, im Voraus zu wissen, wie viele Themen ich hervorbringen würde, wenn ich N -Goroutinen erstellen würde?

Wenn wir beispielsweise die folgende Funktion aufrufen, würden wir wissen, wie viele (oder die maximale Anzahl) Systemsthreads für N -Goroutinen erstellt würden:

type Vector []float64

// Apply the operation to n elements of v starting at i.
func (v Vector) DoSome(i, n int, u Vector, c chan int) {
    for ; i < n; i++ {
        v[i] += u.Op(v[i])
    }
    c <- 1;    // signal that this piece is done
}
War es hilfreich?

Lösung

Laut Pikes GO -Kurs PDF -Folien (Tag 3):

... Wenn Sie eine Parallelität auf Benutzerebene wünschen, müssen Sie festlegen $GOMAXPROCS oder anrufen runtime.GOMAXPROCS(n). GOMAXPROCS teilt dem Laufzeitplaner mit, wie viele nicht-syscall-blockierte Goroutinen gleichzeitig ausgeführt werden sollen.

Bezogen auf Dieser Blog -Beitrag, Auch es scheint die Umgebungsvariable zu setzen GOMAXPROCS Ermöglicht es Ihnen, die Anzahl der Threads zu beheben. Ich bin mir nicht sicher, wie ich die Standardnummer der Threads erhalten kann, die die Laufzeit verwaltet, wenn Sie diesen Wert jedoch nicht angeben.

Dieser Blog -Beitrag Es scheint zu implizieren, dass die Laufzeit, wenn Sie nicht die Umgebungsvariable festlegen, nur einen Kern verwenden (vermutlich, weil sie nur einen Prozess verwendet).

Andere Tipps

Jede Goroutine kann jeweils maximal einen Thread 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 die maximale Ebene der Parallelität.

Es können jedoch mehr Threads verwendet werden, selbst mit gomaxProcs = 1, wenn Goroutines direkt auf Systemaufrufen oder Aufrufe in C blockiert werden.

Die folgenden Operationen tun dies nicht Lassen Sie die Goroutine beim Blockieren einen Thread verwenden:

  • Kanalvorgänge
  • Netzwerkoperationen
  • Schlafen
  • alle Primitiven in der Synchronisation Paket

Dies bedeutet beispielsweise, dass Sie für jeden einzelnen einen Thread verwenden, wenn Sie viele Goroutinen haben, die /dev /ttyxx blockieren und auf dem Lesen blockieren. Gleiches gilt, wenn Sie eine Ladung von Prozessen ausführen und darauf warten, dass sie beenden.

Derzeit erstellt GCCGO einen Thread pro Goroutine.

Ich weiß nichts über 6G.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top