Einführung
Das Zeitpaket in Go bietet verschiedene zeitbezogene Funktionen, einschließlich time.Sleep, das die Ausführung einer Goroutine für eine bestimmte Dauer anhält. Diese Frage untersucht, ob time.Sleep tatsächlich eine Goroutine blockiert und untersucht das Verhalten des Go-Schedulers, wenn Goroutinen time.Sleep verwenden.
Erklärung
Gemäß den Angaben Antwort, Zeit. Sleep blockiert tatsächlich eine Goroutine. Es ist jedoch wichtig zu beachten, dass das Konzept des „Blockierens“ in Go nicht streng definiert ist. „Blockieren“ bedeutet in diesem Zusammenhang, dass die Ausführung der nächsten Anweisung nicht sofort fortgesetzt werden kann, da die aktuelle Anweisung noch in Bearbeitung ist.
Goroutinen-Planung
Goroutinen werden geplant auf Threads durch den Go-Scheduler. Der Scheduler folgt dem „MPG-Modell“, wobei P die Anzahl der Prozessoren, M die Anzahl der Betriebssystem-Threads und G die Anzahl der Goroutinen darstellt. Wenn eine Goroutine blockiert ist, trennt der Planer sie von ihrem aktuellen M und findet ein inaktives M, auf dem sie geplant werden kann, oder erstellt bei Bedarf ein neues M.
Thread-Count-Beobachtung
Die Beobachtung, dass die Anzahl der Threads zunimmt, wenn der Wert von n erhöht wird, ist eine Folge des Verhaltens des Schedulers. Wenn mehr Goroutinen erstellt werden, erstellt der Scheduler zusätzliche M-Threads, um diese zu verarbeiten. Die Tatsache, dass nur eine begrenzte Anzahl zusätzlicher Threads erstellt wird, liegt jedoch an der Fähigkeit des Schedulers, festzustellen, dass nicht alle Goroutinen separate Threads benötigen.
Vergleich mit Real IO
Das bereitgestellte Beispiel mit echtem IO (ioutil.WriteFile) zeigt, dass die Anzahl der Blockierungsvorgänge, die echte Systemressourcen wie IO betreffen, durch Goroutinen ausgeführt wird Anzahl der erstellten Threads ist deutlich höher. Dies liegt daran, dass der Planer nicht umhin kann, Threads zu erstellen, um diese blockierenden Vorgänge zu verarbeiten.
Fazit
Time.Sleep blockiert zwar Goroutinen, es liegt jedoch in der Verantwortung des Planers, dies zu tun Verwalten Sie die Zuordnung von Goroutinen zu Threads effizient. Entwickler müssen sich nicht um die Besonderheiten des Scheduler-Verhaltens kümmern und können sich darauf verlassen, dass die Go-Laufzeit diese Probleme effektiv behebt.
Das obige ist der detaillierte Inhalt vonBlockiert time.Sleep eine Goroutine in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!