Inhaltsverzeichnis
1. Goroutine
2. Channel
3. Select
4. WaitGroup
Heim Backend-Entwicklung Golang Detaillierte Erläuterung gängiger gleichzeitiger Programmiermuster in Golang

Detaillierte Erläuterung gängiger gleichzeitiger Programmiermuster in Golang

Feb 28, 2024 pm 05:12 PM
golang go语言 模式 并发

Detaillierte Erläuterung gängiger gleichzeitiger Programmiermuster in Golang

Detaillierte Erläuterung gängiger gleichzeitiger Programmiermuster in Golang

Mit der kontinuierlichen Entwicklung der Softwareentwicklungsbranche wird die Nachfrage nach hoher Leistung und hoher Parallelität immer dringlicher. Die gleichzeitige Programmierung ist zu einem unverzichtbaren Bestandteil der modernen Softwareentwicklung geworden, und Golang (Go-Sprache) bietet als Sprache, die sich besonders für die gleichzeitige Programmierung eignet, eine Fülle von Mustern und Werkzeugen für die gleichzeitige Programmierung. In diesem Artikel werden die gängigen gleichzeitigen Programmiermuster in Golang ausführlich vorgestellt und ihre Implementierung anhand spezifischer Codebeispiele veranschaulicht.

1. Goroutine

Goroutine ist die Grundeinheit der gleichzeitigen Programmierung in Golang. Es ist ein leichter Thread, der von der Laufzeitumgebung der Go-Sprache verwaltet wird. Eine neue Goroutine kann über das Schlüsselwort go erstellt werden und die angegebene Funktion ausführen. Hier ist ein einfaches Beispiel: go关键字可以创建一个新的Goroutine,并执行指定的函数。下面是一个简单的例子:

package main

import (
    "fmt"
    "time"
)

func hello() {
    fmt.Println("Hello, Goroutine!")
}

func main() {
    go hello()
    time.Sleep(1 * time.Second)
    fmt.Println("Main function")
}
Nach dem Login kopieren

上面的代码中使用go hello()创建一个新的Goroutine,在Goroutine中打印"Hello, Goroutine!",同时主函数继续执行并在1秒后打印"Main function"。这展示了Goroutine的基本使用方式。

2. Channel

Channel是Golang中用于Goroutine之间通信的重要机制,它可以安全地在不同Goroutine之间传递数据。Channel可以被用于同步和异步通信。下面是一个简单的例子:

package main

import "fmt"

func sender(ch chan<- string) {
    ch <- "Hello from sender"
}

func receiver(ch <-chan string) {
    msg := <-ch
    fmt.Println(msg)
}

func main() {
    ch := make(chan string)
    go sender(ch)
    receiver(ch)
}
Nach dem Login kopieren

在上面的代码中,sender函数将"Hello from sender"发送到Channel中,而receiver函数从Channel中接收数据并打印出来。通过Channel,不同的Goroutine可以安全地传递数据。

3. Select

Select语句用于处理多个Channel的消息,它类似于switch语句,但是用于通信操作。下面是一个示例:

package main

import (
    "fmt"
    "time"
)

func ping(ch chan string) {
    for {
        ch <- "ping"
        time.Sleep(1 * time.Second)
    }
}

func pong(ch chan string) {
    for {
        ch <- "pong"
        time.Sleep(1 * time.Second)
    }
}

func main() {
    ch1 := make(chan string)
    ch2 := make(chan string)

    go ping(ch1)
    go pong(ch2)

    for {
        select {
        case msg1 := <-ch1:
            fmt.Println(msg1)
        case msg2 := <-ch2:
            fmt.Println(msg2)
        }
    }
}
Nach dem Login kopieren

在上面的示例中,通过select语句实现了从两个不同的Channel中接收数据,并打印出来。这种方式可以很方便地实现多路复用。

4. WaitGroup

WaitGroup用于等待一组Goroutine的完成,主函数在等待所有的Goroutine执行完成之后再继续执行。下面是一个例子:

package main

import (
    "fmt"
    "sync"
    "time"
)

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Printf("Worker %d started
", id)
    time.Sleep(1 * time.Second)
    fmt.Printf("Worker %d finished
", id)
}

func main() {
    var wg sync.WaitGroup
    for i := 1; i <= 3; i++ {
        wg.Add(1)
        go worker(i, &wg)
    }
    wg.Wait()
    fmt.Println("All workers have finished")
}
Nach dem Login kopieren

上面的代码创建了三个Goroutine执行worker函数,使用WaitGroup等待所有的Goroutine执行完成。在主函数中调用wg.Wait()rrreee

Verwenden Sie im obigen Code go hello(), um eine neue Goroutine zu erstellen, geben Sie „Hallo, Goroutine!“ in Goroutine aus und die Hauptfunktion wird weiterhin ausgeführt und Ausführen „Hauptfunktion“ nach 1 Sekunde drucken. Dies zeigt die grundlegende Verwendung von Goroutine.

2. Kanal🎜🎜Kanal ist ein wichtiger Mechanismus für die Kommunikation zwischen Goroutinen. Er kann Daten sicher zwischen verschiedenen Goroutinen übertragen. Kanäle können für synchrone und asynchrone Kommunikation verwendet werden. Hier ist ein einfaches Beispiel: 🎜rrreee🎜Im obigen Code sendet die Funktion sender „Hallo vom Sender“ an den Kanal und die Funktion receiver empfängt Daten vom Kanal und drucken Sie es aus. Über Channel können verschiedene Goroutinen Daten sicher übertragen. 🎜🎜3. Select🎜🎜Die Select-Anweisung wird zum Verarbeiten von Nachrichten von mehreren Kanälen verwendet. Sie ähnelt der switch-Anweisung, wird jedoch für Kommunikationsvorgänge verwendet. Hier ist ein Beispiel: 🎜rrreee🎜Im obigen Beispiel wird die select-Anweisung verwendet, um Daten von zwei verschiedenen Kanälen zu empfangen und auszudrucken. Mit dieser Methode kann problemlos Multiplexing erreicht werden. 🎜🎜4. WaitGroup🎜🎜WaitGroup wird verwendet, um auf den Abschluss einer Gruppe von Goroutinen zu warten. Die Hauptfunktion wartet auf den Abschluss aller Goroutinen, bevor sie mit der Ausführung fortfährt. Hier ist ein Beispiel: 🎜rrreee🎜Der obige Code erstellt drei Goroutinen, um die Funktion worker auszuführen, und verwendet WaitGroup, um auf den Abschluss aller Goroutine-Ausführungen zu warten. Rufen Sie wg.Wait() in der Hauptfunktion auf, um auf den Abschluss aller Goroutinen zu warten und „Alle Arbeiter sind fertig“ auszugeben. 🎜🎜Durch die oben vorgestellten verschiedenen gängigen gleichzeitigen Programmiermuster können wir die Parallelitätsfunktionen von Golang besser nutzen und effiziente gleichzeitige Programme implementieren. In der tatsächlichen Entwicklung kann die Kombination dieser Muster und Tools die Parallelität und Leistung des Programms effektiv verbessern. Ich hoffe, dieser Artikel kann den Lesern hilfreich sein. 🎜

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung gängiger gleichzeitiger Programmiermuster in Golang. 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

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
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)

Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Apr 02, 2025 pm 02:06 PM

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

Welche Bibliotheken in GO werden von großen Unternehmen entwickelt oder von bekannten Open-Source-Projekten bereitgestellt? Welche Bibliotheken in GO werden von großen Unternehmen entwickelt oder von bekannten Open-Source-Projekten bereitgestellt? Apr 02, 2025 pm 04:12 PM

Welche Bibliotheken in GO werden von großen Unternehmen oder bekannten Open-Source-Projekten entwickelt? Bei der Programmierung in Go begegnen Entwickler häufig auf einige häufige Bedürfnisse, ...

Was ist der Unterschied zwischen 'var' und 'Typ' Typenwort Definition in der GO -Sprache? Was ist der Unterschied zwischen 'var' und 'Typ' Typenwort Definition in der GO -Sprache? Apr 02, 2025 pm 12:57 PM

Zwei Möglichkeiten, Strukturen in der GO -Sprache zu definieren: Der Unterschied zwischen VAR- und Typ -Schlüsselwörtern. Bei der Definition von Strukturen sieht die Sprache oft zwei verschiedene Schreibweisen: Erstens ...

Wie löste ich das Problem des Typs des user_id -Typs bei der Verwendung von Redis -Stream, um Nachrichtenwarteschlangen in GO -Sprache zu implementieren? Wie löste ich das Problem des Typs des user_id -Typs bei der Verwendung von Redis -Stream, um Nachrichtenwarteschlangen in GO -Sprache zu implementieren? Apr 02, 2025 pm 04:54 PM

Das Problem der Verwendung von RETISTREAM zur Implementierung von Nachrichtenwarteschlangen in der GO -Sprache besteht darin, die Go -Sprache und Redis zu verwenden ...

Warum hat das Drucken von Saiten mit Println und String () -Funktionen unterschiedliche Effekte? Warum hat das Drucken von Saiten mit Println und String () -Funktionen unterschiedliche Effekte? Apr 02, 2025 pm 02:03 PM

Der Unterschied zwischen Stringdruck in GO -Sprache: Der Unterschied in der Wirkung der Verwendung von Println und String () ist in Go ...

Wie kann sichergestellt werden, dass die Parallelität beim Schreiben von Multi-Process-Protokollen sicher und effizient ist? Wie kann sichergestellt werden, dass die Parallelität beim Schreiben von Multi-Process-Protokollen sicher und effizient ist? Apr 02, 2025 pm 03:51 PM

Effizient behandeln Probleme mit der Parallelitätssicherheit beim Schreiben von Multi-Process-Protokoll. Mehrere Prozesse schreiben gleichzeitig die gleiche Protokolldatei. Wie kann die Parallelität sicher und effizient sichergestellt werden? Das ist ein ...

Wie kann ich das Problem der Einschränkungen des generischen Funktionstyps der Golang -Funktionstypen lösen, die automatisch in VSCODE gelöscht werden? Wie kann ich das Problem der Einschränkungen des generischen Funktionstyps der Golang -Funktionstypen lösen, die automatisch in VSCODE gelöscht werden? Apr 02, 2025 pm 02:15 PM

Automatische Löschung von Golang Generic -Funktionstypeinschränkungen in VSCODE -Benutzern kann auf ein seltsames Problem beim Schreiben von Golang -Code mit VSCODE stoßen. Wann...

See all articles