Heim  >  Artikel  >  Backend-Entwicklung  >  Praktische Erfahrung mit gleichzeitiger Programmierung in Golang: von Goroutinen bis hin zu großen Clustern

Praktische Erfahrung mit gleichzeitiger Programmierung in Golang: von Goroutinen bis hin zu großen Clustern

王林
王林Original
2023-07-18 09:05:311064Durchsuche

Praktische Erfahrung mit der gleichzeitigen Golang-Programmierung: von Goroutinen bis hin zu großen Clustern

Einführung:
Da die Computerarchitektur immer komplexer wird, wird auch die Nachfrage nach Parallelität immer höher. Als Programmiersprache, die den Schwerpunkt auf Parallelität legt, bietet Golang ein leistungsstarkes und prägnantes Parallelitätsmodell, das es Entwicklern erleichtert, effiziente Parallelitätsprogramme zu schreiben. In diesem Artikel werden einige Einblicke in die gleichzeitige Programmierung in Golang gegeben, von der grundlegenden Verwendung von Goroutinen bis zur praktischen Anwendung großer Cluster.

1. Grundlegende Verwendung von Goroutinen: Das Starten von Goroutinen unterscheidet sich von herkömmlichen Multi-Threads. Sie teilen sich den Speicherplatz im selben Prozess, sodass die Kosten für das Starten und Zerstören relativ hoch sind niedrig. . Das Folgende ist ein einfacher Beispielcode:

package main

import (
    "fmt"
    "time"
)

func main() {
    go task1()
    go task2()

    // 等待任务完成
    time.Sleep(2 * time.Second)

    fmt.Println("All tasks completed!")
}

func task1() {
    for i := 1; i <= 5; i++ {
        fmt.Println("Task 1 is running...")
        time.Sleep(500 * time.Millisecond)
    }
}

func task2() {
    for i := 1; i <= 5; i++ {
        fmt.Println("Task 2 is running...")
        time.Sleep(500 * time.Millisecond)
    }
}

Im obigen Code öffnet die Hauptfunktion zwei Goroutinen und startet zwei Aufgaben, Task1 und Task2. Nachdem über die time.Sleep-Funktion auf den Abschluss der beiden Aufgaben gewartet wurde, wird „Alle Aufgaben abgeschlossen!“ ausgegeben. Wenn Sie den obigen Code ausführen, können Sie sehen, dass die beiden Aufgaben gleichzeitig ausgeführt werden und die Ausgabe abwechselnd erfolgt.

2. Implementieren Sie die Kommunikation zwischen Goroutinen basierend auf Channel

In Golang können Goroutinen über Channel kommunizieren, eine sichere gleichzeitige Datenstruktur, die es Goroutinen ermöglicht, Daten sicher zu senden und zu empfangen. Das Folgende ist ein Beispielcode, der auf Channel basiert:

package main

import (
    "fmt"
)

func main() {
    ch := make(chan int)

    go produce(ch)
    go consume(ch)

    // 等待任务完成
    select {}
}

func produce(ch chan<- int) {
    for i := 1; i <= 5; i++ {
        ch <- i
    }
}

func consume(ch <-chan int) {
    for i := 1; i <= 5; i++ {
        data := <-ch
        fmt.Println("Consumed data:", data)
    }
}

Im obigen Code erstellt die Hauptfunktion einen Channel vom Typ int und übergibt ihn als Parameter an die Producer- und Consumer-Funktionen. Die Produce-Funktion sendet Daten über Kanal ch, während die Consumer-Funktion Daten über Kanal ch empfängt und ausgibt. Wenn Sie den obigen Code ausführen, können Sie sehen, dass die Consumer-Funktion die Daten sofort vom Kanal ch empfängt und ausgibt, nachdem die Funktion „produzieren“ die Daten an den Kanal „ch“ sendet.

3. Verwenden Sie Goroutinen, um die Programmleistung zu verbessern.

Goroutinen in Golang können eine echte parallele Ausführung erreichen und die Ausführungseffizienz des Programms effektiv verbessern. Hier ist ein einfacher Beispielcode:

package main

import (
    "fmt"
    "time"
)

func main() {
    start := time.Now()

    nums := []int{1, 2, 3, 4, 5}
    results := make(chan int)

    for _, num := range nums {
        go square(num, results)
    }

    total := 0
    for i := 0; i < len(nums); i++ {
        total += <-results
    }

    fmt.Println("Total:", total)
    fmt.Println("Execution time:", time.Since(start))
}

func square(num int, results chan<- int) {
    time.Sleep(1 * time.Second) // 模拟耗时操作
    results <- num * num
}

Im obigen Code öffnet die Hauptfunktion 5 Goroutinen, und jede Goroutine sendet das quadratische Ergebnis der Eingabezahl an den Ergebniskanal. Die Haupt-Goroutine empfängt die Daten vom Ergebniskanal über eine Schleife und akkumuliert die Ergebnisse in der Gesamtvariablen. Abschließend werden die Summe und die Ausführungszeit des Programms ausgegeben. Wenn Sie den obigen Code ausführen, können Sie feststellen, dass die Ausführungszeit des Programms aufgrund der gleichzeitigen Ausführung erheblich verkürzt wird.

4. Praktische Anwendung von Großclustern

In praktischen Anwendungen kann das gleichzeitige Programmiermodell von Golang auf den Aufbau von Großclustern angewendet werden. Das Folgende ist ein vereinfachter Beispielcode für einen verteilten Crawler:

package main

import (
    "fmt"
    "sync"
)

func main() {
    urls := []string{"https://www.example.com", "https://www.example.org", "https://www.example.net"}
    results := make(chan string)

    var wg sync.WaitGroup
    for _, url := range urls {
        wg.Add(1)
        go crawl(url, results, &wg)
    }

    go func() {
        wg.Wait()
        close(results)
    }()

    for result := range results {
        fmt.Println("Crawled:", result)
    }
}

func crawl(url string, results chan<- string, wg *sync.WaitGroup) {
    defer wg.Done()

    // 省略具体的爬取逻辑
    results <- url
}

Im obigen Beispiel erstellt die Hauptfunktion einen Ergebniskanal vom Typ „chan string“ zum Empfangen von Crawling-Ergebnissen. Verwenden Sie sync.WaitGroup, um zu warten, bis alle Goroutinen abgeschlossen sind. Jede Goroutine ruft die Crawl-Funktion auf, um eine bestimmte Crawling-Logik zu implementieren und die Ergebnisse an den Ergebniskanal zu senden. Die Haupt-Goroutine erhält die Crawling-Ergebnisse durch Lesen des Ergebniskanals und gibt sie aus.

Zusammenfassung:

Durch die Einführung und Praxis dieses Artikels in die gleichzeitige Golang-Programmierung haben wir etwas über die grundlegende Verwendung von Goroutinen, kanalbasierte Kommunikation, die Verwendung von Parallelität zur Verbesserung der Programmleistung und praktische Anwendungen für große Cluster gelernt. Das gleichzeitige Programmiermodell von Golang ermöglicht Entwicklern das einfache Schreiben effizienter gleichzeitiger Programme und bietet Komfort beim Aufbau großer Cluster. Ich hoffe, dass dieser Artikel beim Erlernen und Üben der gleichzeitigen Programmierung in Golang hilfreich sein kann.

Das obige ist der detaillierte Inhalt vonPraktische Erfahrung mit gleichzeitiger Programmierung in Golang: von Goroutinen bis hin zu großen Clustern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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