Heim >Backend-Entwicklung >Golang >Ausführliche Erklärung der Verwendung und Beispiele von Go WaitGroup

Ausführliche Erklärung der Verwendung und Beispiele von Go WaitGroup

王林
王林Original
2023-09-27 15:36:23993Durchsuche

Go WaitGroup的使用方式及实例详解

Go-Sprache ist eine Programmiersprache mit gleichzeitiger Programmierung als Kern und ist bei der Bearbeitung gleichzeitiger Aufgaben sehr effizient. In der Standardbibliothek der Go-Sprache gibt es ein sehr nützliches Parallelitätstool – WaitGroup. In diesem Artikel wird die Verwendung von WaitGroup im Detail vorgestellt und seine spezifische Anwendung anhand von Beispielen demonstriert.

Zuerst müssen wir die Rolle der WaitGroup verstehen. WaitGroup wird verwendet, um auf den Abschluss einer Gruppe gleichzeitiger Aufgaben zu warten, bevor mit der Ausführung von nachfolgendem Code fortgefahren wird. Normalerweise können wir WaitGroup verwenden, wenn die Haupt-Coroutine warten muss, bis andere Coroutinen eine Aufgabe abgeschlossen haben, bevor sie mit der Ausführung fortfährt.

Unter dem Synchronisierungspaket der Go-Sprache gibt es eine WaitGroup-Struktur mit drei Hauptmethoden, nämlich Add(), Done() und Wait(). Im Folgenden stellen wir ihre Funktionen einzeln vor.

Die erste ist die Add()-Methode, mit der die Anzahl der wartenden Aufgaben erhöht wird. Wir können der WaitGroup mitteilen, wie viele Aufgaben wir auf den Abschluss warten müssen, indem wir die Add()-Methode aufrufen. Die spezifische Aufrufmethode ist wg.Add(n), wobei n die Anzahl der Aufgaben darstellt, auf die gewartet werden muss. Wenn zum Beispiel 10 Aufgaben darauf warten, abgeschlossen zu werden, können wir wg.Add(10) aufrufen.

Dann gibt es noch die Methode Done(), mit der markiert wird, dass die aktuelle Aufgabe erledigt wurde. Wenn jede Aufgabe abgeschlossen ist, muss die Methode Done() aufgerufen werden, um der WaitGroup mitzuteilen, dass die aktuelle Aufgabe abgeschlossen wurde. Die spezifische Aufrufmethode ist wg.Done(). Normalerweise rufen wir die Done()-Methode in der Defer-Anweisung auf, nachdem die Aufgabe abgeschlossen ist, um sicherzustellen, dass die Done()-Methode nach Abschluss der Aufgabe aufgerufen wird.

Schließlich gibt es die Wait()-Methode, mit der die Haupt-Coroutine blockiert wird, bis alle Aufgaben abgeschlossen sind. Wenn die Haupt-Coroutine auf den Abschluss einer Reihe von Aufgaben warten muss, bevor sie mit der Ausführung von nachfolgendem Code fortfährt, kann die Methode Wait() aufgerufen werden. Die spezifische Aufrufmethode ist wg.Wait(). Die Wait()-Methode blockiert, bis alle Aufgaben abgeschlossen sind.

Im Folgenden demonstrieren wir anhand eines Beispiels die konkrete Anwendung von WaitGroup. Angenommen, wir haben eine Liste von Aufgaben, die wir gleichzeitig bearbeiten müssen. Nach Abschluss jeder Aufgabe schreiben wir die Ergebnisse in eine Ergebnisliste. Schließlich müssen wir warten, bis alle Aufgaben abgeschlossen sind, bevor wir die Ergebnisliste drucken. Der Code lautet wie folgt:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    taskList := []string{"task1", "task2", "task3", "task4"}

    // 创建结果列表
    resultList := make([]string, len(taskList))

    // 遍历任务列表,开启多个协程处理任务
    for i, task := range taskList {
        wg.Add(1) // 增加等待的任务数

        go func(index int, task string) {
            defer wg.Done() // 标志任务已经完成

            // 模拟任务处理过程
            result := fmt.Sprintf("task %s processed", task)

            // 将结果写入结果列表
            resultList[index] = result
        }(i, task)
    }

    wg.Wait() // 等待所有任务完成

    // 打印结果列表
    for _, result := range resultList {
        fmt.Println(result)
    }
}

Im obigen Code erstellen wir zunächst ein WaitGroup-Objekt wg. Dann durchlaufen wir die Aufgabenliste und rufen wg.Add(1) einmal für jede Aufgabe auf, um anzuzeigen, dass es eine Aufgabe gibt, auf die wir warten müssen. In der Handlerfunktion jeder Aufgabe rufen wir wg.Done() einmal auf, nachdem die Aufgabe abgeschlossen ist. Schließlich haben wir wg.Wait() in der Haupt-Coroutine aufgerufen, um auf den Abschluss aller Aufgaben zu warten.

Durch dieses Design können wir Aufgaben gleichzeitig verarbeiten und sicherstellen, dass wir nach Abschluss aller Aufgaben mit der anschließenden Ausführung der Hauptkoroutine fortfahren können. Abschließend haben wir die Ergebnisliste ausgedruckt, um die gleichzeitige Bearbeitung von Aufgaben und die Richtigkeit der Ergebnisse zu überprüfen.

Zusammenfassend ist WaitGroup ein sehr praktisches Parallelitätstool in der Go-Sprache. Durch die ordnungsgemäße Verwendung von WaitGroup können wir gleichzeitige Aufgaben besser verwalten und die Reihenfolge und Richtigkeit der Aufgaben sicherstellen. Ich hoffe, dass dieser Artikel den Lesern helfen kann, WaitGroup besser zu verstehen und anzuwenden.

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung der Verwendung und Beispiele von Go WaitGroup. 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