Inhaltsverzeichnis
Ich. Goroutinen: Ein tiefer Einblick in das Parallelitätsmodell von Go
II. Die internen Mechanismen von Goroutine verstehen
Konzeptionelle Grundlagen
Parallelität vs. Parallelität
Prozesse und Threads
Koroutinen
Das GPM-Planungsmodell
Planung in Aktion
III. Arbeiten mit Goroutinen
Grundlegende Verwendung
Praxisbeispiele
Beispiel 1: Einfache Goroutine-Berechnung
Goroutine-Fehlerbehandlung
Goroutinen synchronisieren
Beispiel 1: Verwendung von sync.WaitGroup
Beispiel 2: Verwendung von Kanälen zur Synchronisierung
Kommunikation zwischen Goroutinen
Beispiel: Produzenten-Konsumenten-Muster
Leapcell: Eine serverlose Plattform für Go
Heim Backend-Entwicklung Golang Go's Concurrency Decoded: Goroutine Scheduling

Go's Concurrency Decoded: Goroutine Scheduling

Jan 14, 2025 pm 10:08 PM

Go

Ich. Goroutinen: Ein tiefer Einblick in das Parallelitätsmodell von Go

Goroutinen sind ein Eckpfeiler des Go-Designs und bieten einen leistungsstarken Mechanismus für die gleichzeitige Programmierung. Als leichtgewichtige Coroutinen vereinfachen sie die parallele Aufgabenausführung. Das Starten einer Goroutine ist unkompliziert: Stellen Sie einem Funktionsaufruf einfach das Schlüsselwort go voran und starten Sie so die asynchrone Ausführung. Das Hauptprogramm wird fortgesetzt, ohne auf den Abschluss der Goroutine zu warten.

go func() { // Launch a goroutine using the 'go' keyword
    // ... code to be executed concurrently ...
}()
Nach dem Login kopieren
Nach dem Login kopieren

II. Die internen Mechanismen von Goroutine verstehen

Konzeptionelle Grundlagen

Parallelität vs. Parallelität

  • Parallelität: Die Fähigkeit, mehrere Aufgaben scheinbar gleichzeitig auf einer einzigen CPU zu verwalten. Die CPU wechselt schnell zwischen Aufgaben, wodurch die Illusion einer parallelen Ausführung entsteht. Während es mikroskopisch sequentiell ist, erscheint es makroskopisch gleichzeitig.

  • Parallelität: Echte gleichzeitige Ausführung mehrerer Aufgaben auf mehreren CPUs, wodurch CPU-Ressourcenkonflikte vermieden werden.

Prozesse und Threads

  • Prozess: Eine eigenständige Ausführungsumgebung mit eigenen Ressourcen (Speicher, Dateien usw.). Das Wechseln zwischen Prozessen ist ressourcenintensiv und erfordert einen Eingriff auf Kernel-Ebene.

  • Thread: Eine leichte Ausführungseinheit innerhalb eines Prozesses, die die Ressourcen des Prozesses gemeinsam nutzt. Der Threadwechsel verursacht weniger Aufwand als der Prozesswechsel.

Koroutinen

Coroutinen verwalten ihren eigenen Registerkontext und Stapel. Das Wechseln zwischen Coroutinen erfordert das Speichern und Wiederherstellen dieses Zustands, sodass sie die Ausführung an der Stelle fortsetzen können, an der sie aufgehört haben. Im Gegensatz zu Prozessen und Threads erfolgt die Verwaltung von Coroutinen innerhalb des Benutzerprogramms und nicht im Betriebssystem. Goroutinen sind eine spezielle Art von Coroutine.

Das GPM-Planungsmodell

Gos effiziente Parallelität basiert auf dem GPM-Planungsmodell. Vier Schlüsselkomponenten sind beteiligt: ​​M, P, G und Sched (Sched ist in den Diagrammen nicht dargestellt).

  • M (Maschine): Ein Thread auf Kernel-Ebene. Goroutinen laufen auf Ms.

  • G (Goroutine): Eine einzelne Goroutine. Jedes G verfügt über seinen eigenen Stapel, Befehlszeiger und andere planungsbezogene Informationen (z. B. Kanäle, auf die es wartet).

  • P (Prozessor): Ein logischer Prozessor, der Goroutinen verwaltet und ausführt. Es unterhält eine Ausführungswarteschlange bereiter Goroutinen.

  • Sched (Scheduler): Der zentrale Planer, der M- und G-Warteschlangen verwaltet und eine effiziente Ressourcenzuweisung gewährleistet.

Planung in Aktion

Go&#s Concurrency Decoded: Goroutine Scheduling

Das Diagramm zeigt zwei Betriebssystem-Threads (M), jeweils mit einem Prozessor (P), der eine Goroutine ausführt.

  • GOMAXPROCS() steuert die Anzahl der Ps (und damit den wahren Grad der Parallelität).

  • Die grauen Gs sind fertig, laufen aber noch nicht. P verwaltet diese Ausführungswarteschlange.

  • Durch das Starten einer Goroutine wird diese zur Ausführungswarteschlange von P hinzugefügt.

Go&#s Concurrency Decoded: Goroutine Scheduling

Wenn ein M0 blockiert ist, wechselt P zu M1 (der möglicherweise aus einem Thread-Cache abgerufen wird).

Go&#s Concurrency Decoded: Goroutine Scheduling

Wenn ein P seine Aufgaben schnell erledigt, könnte er anderen Ps Arbeit stehlen, um die Effizienz aufrechtzuerhalten.

III. Arbeiten mit Goroutinen

Grundlegende Verwendung

Legen Sie die Anzahl der CPUs für die Goroutine-Ausführung fest (die Standardeinstellung in neueren Go-Versionen ist normalerweise ausreichend):

go func() { // Launch a goroutine using the 'go' keyword
    // ... code to be executed concurrently ...
}()
Nach dem Login kopieren
Nach dem Login kopieren

Praxisbeispiele

Beispiel 1: Einfache Goroutine-Berechnung

num := runtime.NumCPU() // Get the number of logical CPUs
runtime.GOMAXPROCS(num) // Set the maximum number of concurrently running goroutines
Nach dem Login kopieren

Goroutine-Fehlerbehandlung

Unbehandelte Ausnahmen in einer Goroutine können das gesamte Programm beenden. Verwenden Sie recover() innerhalb einer defer-Anweisung, um mit Paniken umzugehen:

package main

import (
    "fmt"
    "runtime"
)

func cal(a, b int) {
    c := a + b
    fmt.Printf("%d + %d = %d\n", a, b, c)
}

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())
    for i := 0; i < 10; i++ {
        go cal(i, i+1)
    }
    //Note:  The main function exits before goroutines complete in this example.  See later sections for synchronization.
}
Nach dem Login kopieren

Goroutinen synchronisieren

Da Goroutinen asynchron laufen, wird das Hauptprogramm möglicherweise beendet, bevor sie abgeschlossen sind. Verwenden Sie sync.WaitGroup oder Kanäle zur Synchronisierung:

Beispiel 1: Verwendung von sync.WaitGroup

package main

import (
    "fmt"
)

func addele(a []int, i int) {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Error in addele:", r)
        }
    }()
    a[i] = i // Potential out-of-bounds error if i is too large
    fmt.Println(a)
}

func main() {
    a := make([]int, 4)
    for i := 0; i < 5; i++ {
        go addele(a, i)
    }
    // ... (add synchronization to wait for goroutines to finish) ...
}
Nach dem Login kopieren

Beispiel 2: Verwendung von Kanälen zur Synchronisierung

package main

import (
    "fmt"
    "sync"
)

func cal(a, b int, wg *sync.WaitGroup) {
    defer wg.Done()
    c := a + b
    fmt.Printf("%d + %d = %d\n", a, b, c)
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go cal(i, i+1, &wg)
    }
    wg.Wait()
}
Nach dem Login kopieren

Kommunikation zwischen Goroutinen

Kanäle erleichtern die Kommunikation und den Datenaustausch zwischen Goroutinen. Es können auch globale Variablen verwendet werden, im Allgemeinen werden jedoch Kanäle zur besseren Kontrolle der Parallelität bevorzugt.

Beispiel: Produzenten-Konsumenten-Muster

package main

import (
    "fmt"
)

func cal(a, b int, ch chan bool) {
    c := a + b
    fmt.Printf("%d + %d = %d\n", a, b, c)
    ch <- true // Signal completion
}

func main() {
    ch := make(chan bool, 10) // Buffered channel to avoid blocking
    for i := 0; i < 10; i++ {
        go cal(i, i+1, ch)
    }
    for i := 0; i < 10; i++ {
        <-ch // Wait for each goroutine to finish
    }
}
Nach dem Login kopieren

Leapcell: Eine serverlose Plattform für Go

Leapcell ist eine empfohlene Plattform für die Bereitstellung von Go-Diensten.

Go

Hauptmerkmale:

  1. Mehrsprachige Unterstützung: JavaScript, Python, Go, Rust.
  2. Kostenlose unbegrenzte Projekte:Pay-as-you-go-Preise.
  3. Kostengünstig:Keine Leerlaufgebühren.
  4. Entwicklerfreundlich: Intuitive Benutzeroberfläche, automatisiertes CI/CD, Echtzeitmetriken.
  5. Skalierbar und leistungsstark: Automatische Skalierung, kein Betriebsaufwand.

Go

Erfahren Sie mehr in der Dokumentation!

Leapcell Twitter: https://www.php.cn/link/7884effb9452a6d7a7a79499ef854afd

Das obige ist der detaillierte Inhalt vonGo's Concurrency Decoded: Goroutine Scheduling. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

<🎜>: Bubble Gum Simulator Infinity - So erhalten und verwenden Sie Royal Keys
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusionssystem, erklärt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1675
14
PHP-Tutorial
1278
29
C#-Tutorial
1257
24
Golang gegen Python: Leistung und Skalierbarkeit Golang gegen Python: Leistung und Skalierbarkeit Apr 19, 2025 am 12:18 AM

Golang ist in Bezug auf Leistung und Skalierbarkeit besser als Python. 1) Golangs Kompilierungseigenschaften und effizientes Parallelitätsmodell machen es in hohen Parallelitätsszenarien gut ab. 2) Python wird als interpretierte Sprache langsam ausgeführt, kann aber die Leistung durch Tools wie Cython optimieren.

Golang und C: Parallelität gegen Rohgeschwindigkeit Golang und C: Parallelität gegen Rohgeschwindigkeit Apr 21, 2025 am 12:16 AM

Golang ist in Gleichzeitigkeit besser als C, während C bei Rohgeschwindigkeit besser als Golang ist. 1) Golang erreicht durch Goroutine und Kanal eine effiziente Parallelität, die zum Umgang mit einer großen Anzahl von gleichzeitigen Aufgaben geeignet ist. 2) C über Compiler -Optimierung und Standardbibliothek bietet es eine hohe Leistung in der Nähe der Hardware, die für Anwendungen geeignet ist, die eine extreme Optimierung erfordern.

Erste Schritte mit Go: Ein Anfängerführer Erste Schritte mit Go: Ein Anfängerführer Apr 26, 2025 am 12:21 AM

GoisidealforBeginersandSuitableforCloudandNetWorkServicesDuetoitsSimplicity, Effizienz und Konsumfeaturen.1) InstallgoFromTheofficialwebSiteAnDverifyWith'goversion'.2) CreateAneDrunyourFirstProgramwith'gorunhello.go.go.go.

Golang gegen C: Leistung und Geschwindigkeitsvergleich Golang gegen C: Leistung und Geschwindigkeitsvergleich Apr 21, 2025 am 12:13 AM

Golang ist für schnelle Entwicklung und gleichzeitige Szenarien geeignet, und C ist für Szenarien geeignet, in denen extreme Leistung und Kontrolle auf niedriger Ebene erforderlich sind. 1) Golang verbessert die Leistung durch Müllsammlung und Parallelitätsmechanismen und eignet sich für die Entwicklung von Webdiensten mit hoher Konsequenz. 2) C erreicht die endgültige Leistung durch das manuelle Speicherverwaltung und die Compiler -Optimierung und eignet sich für eingebettete Systementwicklung.

Golang gegen Python: Schlüsselunterschiede und Ähnlichkeiten Golang gegen Python: Schlüsselunterschiede und Ähnlichkeiten Apr 17, 2025 am 12:15 AM

Golang und Python haben jeweils ihre eigenen Vorteile: Golang ist für hohe Leistung und gleichzeitige Programmierung geeignet, während Python für Datenwissenschaft und Webentwicklung geeignet ist. Golang ist bekannt für sein Parallelitätsmodell und seine effiziente Leistung, während Python für sein Ökosystem für die kurze Syntax und sein reiches Bibliothek bekannt ist.

Golang und C: Die Kompromisse bei der Leistung Golang und C: Die Kompromisse bei der Leistung Apr 17, 2025 am 12:18 AM

Die Leistungsunterschiede zwischen Golang und C spiegeln sich hauptsächlich in der Speicherverwaltung, der Kompilierungsoptimierung und der Laufzeiteffizienz wider. 1) Golangs Müllsammlung Mechanismus ist praktisch, kann jedoch die Leistung beeinflussen.

Das Performance -Rennen: Golang gegen C. Das Performance -Rennen: Golang gegen C. Apr 16, 2025 am 12:07 AM

Golang und C haben jeweils ihre eigenen Vorteile bei Leistungswettbewerben: 1) Golang ist für eine hohe Parallelität und schnelle Entwicklung geeignet, und 2) C bietet eine höhere Leistung und eine feinkörnige Kontrolle. Die Auswahl sollte auf Projektanforderungen und Teamtechnologie -Stack basieren.

Golang gegen Python: Die Vor- und Nachteile Golang gegen Python: Die Vor- und Nachteile Apr 21, 2025 am 12:17 AM

GolangissidealforbuildingsCalablesSystemduetoitseffizienz und Konsumverkehr, whilepythonexcelsinquickScriptingandDataanalyseduetoitssimplication und VacevastEcosystem.golangsDesineScouragesCouragescournations, tadelcodedeanDitsGoroutaTinoutgoroutaTinoutgoroutaTinoutsGoroutinesGoroutinesGoroutsGoroutins, t

See all articles