Heim Backend-Entwicklung Golang Wie verwende ich Coroutinen in Go?

Wie verwende ich Coroutinen in Go?

May 11, 2023 pm 03:31 PM
协程、go语言、并发

Mit der Entwicklung der Internet-Technologie werden immer höhere Anforderungen an effizientes Multitasking gestellt. In der Go-Sprache sind Coroutinen eine sehr wichtige Funktion, die dieses Problem sehr gut lösen kann. In diesem Artikel wird erläutert, wie Sie mithilfe von Coroutinen die gleichzeitige Programmierung in Go implementieren.

1. Was ist eine Coroutine? Eine Coroutine ist ein leichter Thread, auch bekannt als Benutzermodus-Thread. Im Vergleich zur herkömmlichen Multithread-Programmierung bestehen die Vorteile von Coroutinen darin, dass sie leichter sind, weniger Systemressourcen beanspruchen, den Kontext schneller wechseln und sich nicht mit Thread-Sicherheitsproblemen wie Sperren wie bei der Multithread-Programmierung befassen müssen. In der Go-Sprache wird Goroutine zur Implementierung von Coroutinen verwendet.

2. Erstellen und starten Sie eine Coroutine

In der Go-Sprache können Sie die go-Anweisung verwenden, um eine Coroutine zu starten. Was auf die go-Anweisung folgt, ist ein Funktionsaufruf, der eine neue Coroutine startet, um die Funktion auszuführen.

Zum Beispiel:

func main() {
    go printHello()  // 启动一个goroutine去执行printHello函数
    fmt.Println("main function")
}

func printHello() {
    fmt.Println("hello goroutine")
}
Nach dem Login kopieren

Im obigen Code verwenden wir die go-Anweisung, um eine neue Coroutine zu starten, um die printHello-Funktion auszuführen. Die printHello-Funktion wird in der neuen Coroutine ausgeführt, ohne den Hauptthread zu blockieren. Nachdem die Hauptfunktion ausgeführt wurde, wird das Programm nicht sofort beendet, da die printHello-Funktion noch ausgeführt wird.

3. Kommunikation von Coroutinen

Da bei Coroutinen der Speicher zwischen verschiedenen Coroutinen geteilt wird, kommt es zu Kommunikationsproblemen zwischen mehreren Coroutinen. Die Go-Sprache bietet Kanäle zur Implementierung der Kommunikation zwischen Coroutinen. Die kanalbasierte Kommunikationsmethode ist eine sehr effiziente und sichere Kommunikationsmethode.

1. Definition und Initialisierung des Kanals

In der Go-Sprache können Sie die Make-Funktion verwenden, um einen Kanal zu erstellen. Die Syntax lautet:

channel_name := make(chan data_type)
Nach dem Login kopieren

Dabei ist data_type der Typ der im Kanal übertragenen Daten. Im folgenden Code erstellen wir beispielsweise einen Kanal, der Daten vom Typ int überträgt:

ch := make(chan int)
Nach dem Login kopieren

2. Lesen und Schreiben des Kanals

Der Kanal kann sowohl Sende- als auch Empfangsvorgänge ausführen. Sowohl Sende- als auch Empfangsvorgänge blockieren.

Sendevorgang: Verwenden Sie den <--Operator des Kanals, um den Sendevorgang auszuführen, das heißt:
  • channel_name <- value
    Nach dem Login kopieren
  • wobei Wert der zu sendende Wert ist. Im folgenden Code senden wir beispielsweise den Wert 1 an den Kanal mit dem Namen ch:
ch <- 1  // 向ch中发送数值1
Nach dem Login kopieren

Empfangsvorgang: Verwenden Sie den <- Operator des Kanals, um den Empfangsvorgang auszuführen, das heißt:
  • value := <- channel_name
    Nach dem Login kopieren
  • wobei der Wert ist der erhaltene Wert. Im folgenden Code erhalten wir beispielsweise einen Wert vom Kanal mit dem Namen ch und weisen ihn der Variablen x zu:
x := <- ch  // 从ch中接收一个数值,并将其赋值给变量x
Nach dem Login kopieren

Es ist zu beachten, dass der Empfangsvorgang automatisch blockiert wird, wenn im Kanal keine Daten zum Empfangen vorhanden sind bis Daten zum Empfang verfügbar sind. Wenn der Kanal voll ist, wird der Sendevorgang ebenfalls blockiert, bis genügend Platz zum Senden vorhanden ist.

4. Verwenden Sie mehrere Coroutinen für die Kommunikation

Das Folgende ist ein einfaches Beispiel, in dem zwei Coroutinen erstellt werden, eine sendet Daten an den Kanal und die andere empfängt Daten vom Kanal. Die Datenkommunikation zwischen diesen beiden Coroutinen erfolgt über Kanäle:

func main() {
    ch := make(chan int)
    go producer(ch)
    go consumer(ch)
    time.Sleep(1 * time.Second)
}

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

func consumer(ch chan int) {
    for i := range ch {
        fmt.Println("received:", i)
    }
}
Nach dem Login kopieren

Im obigen Code generiert die Producer-Coroutine Werte und sendet Daten an den Kanal, während die Consumer-Coroutine Daten vom Kanal empfängt und ausdruckt. In der Hauptfunktion starten wir die Producer- bzw. Consumer-Coroutinen über die go-Anweisung. Aufgrund der blockierenden Natur des Kanals können die Producer- und Consumer-Coroutinen sicher kommunizieren, ohne sich Gedanken über Dateninkonsistenzen machen zu müssen.

4. Synchronisierung von Coroutinen

Bei der Multi-Coroutine-Programmierung müssen Sie manchmal warten, bis andere Coroutinen abgeschlossen sind, bevor Sie bestimmte Operationen ausführen. In diesem Fall müssen Sie die Coroutine-Synchronisationstechnologie verwenden.

Go-Sprache stellt ein Sync-Paket bereit, das einige grundlegende Tools für die Coroutine-Synchronisierung enthält:

WaitGroup: Warten Sie, bis eine Gruppe von Coroutinen die Ausführung abgeschlossen hat, bevor Sie eine Operation ausführen.
  • Mutex: Mutex-Sperre, um zu verhindern, dass mehrere Coroutinen gleichzeitig mit denselben Daten arbeiten.
  • Cond: Bedingungsvariable, die es einer Coroutine ermöglicht, auf die Erfüllung einer bestimmten Bedingung zu warten, bevor sie die nächste Operation ausführt.
  • Hier nehmen wir WaitGroup als Beispiel, um die Implementierung der Coroutine-Synchronisation vorzustellen.

1. Definition und Initialisierung von WaitGroup

Bevor Sie WaitGroup verwenden, müssen Sie die Add-Methode verwenden, um die Anzahl der Coroutinen hinzuzufügen, auf die in WaitGroup gewartet werden soll. Zum Beispiel:

var wg sync.WaitGroup
wg.Add(2)
Nach dem Login kopieren

Im obigen Code haben wir WaitGroup zwei Coroutinen hinzugefügt.

2. Rufen Sie die Done-Methode auf, nachdem die Ausführung der Coroutine abgeschlossen ist.

Nachdem die Ausführung der Coroutine abgeschlossen ist, muss die Done-Methode von WaitGroup aufgerufen werden, um beispielsweise anzuzeigen, dass die Ausführung einer Coroutine abgeschlossen ist :

go func() {
    defer wg.Done()  // 协程执行完成后调用Done方法
    ...
}()
Nach dem Login kopieren

Im obigen Code fügen wir der WaitGroup eine Coroutine hinzu und rufen die Done-Methode auf, nachdem die Coroutine-Ausführung abgeschlossen ist.

3. Warten Sie, bis die Ausführung aller Coroutinen abgeschlossen ist.

Nachdem Sie alle Coroutinen, auf die gewartet werden muss, zur WaitGroup hinzugefügt haben, verwenden Sie die Wait-Methode, um auf den Abschluss der Ausführung aller Coroutinen zu warten. Zum Beispiel:

wg.Wait()  // 等待所有协程执行完成
Nach dem Login kopieren

Im obigen Code verwenden wir die Wait-Methode, um zu warten, bis die gesamte Coroutine-Ausführung abgeschlossen ist. Die Wait-Methode blockiert die Haupt-Goroutine, bis alle Coroutinen ausgeführt sind.

5. Zusammenfassung

Dieser Artikel stellt die Verwendung von Coroutinen in der Go-Sprache vor, einschließlich des Erstellens und Startens von Coroutinen, der Coroutinen-Kommunikation, der Coroutinen-Synchronisation usw. Coroutinen sind ein sehr wichtiges Feature in der Go-Sprache und spielen eine sehr wichtige Rolle bei der Multitasking- und High-Concurrency-Programmierung. Der Einsatz von Coroutinen kann dazu führen, dass Programme effizienter und stabiler laufen, und Entwicklern außerdem die gleichzeitige Programmierung erleichtern.

Das obige ist der detaillierte Inhalt vonWie verwende ich Coroutinen in Go?. 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ß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)

Was sind die Schwachstellen von Debian Openensl Was sind die Schwachstellen von Debian Openensl Apr 02, 2025 am 07:30 AM

OpenSSL bietet als Open -Source -Bibliothek, die in der sicheren Kommunikation weit verbreitet sind, Verschlüsselungsalgorithmen, Tasten und Zertifikatverwaltungsfunktionen. In seiner historischen Version sind jedoch einige Sicherheitslücken bekannt, von denen einige äußerst schädlich sind. Dieser Artikel konzentriert sich auf gemeinsame Schwachstellen und Antwortmaßnahmen für OpenSSL in Debian -Systemen. DebianopensL Bekannte Schwachstellen: OpenSSL hat mehrere schwerwiegende Schwachstellen erlebt, wie z. Ein Angreifer kann diese Sicherheitsanfälligkeit für nicht autorisierte Lesen sensibler Informationen auf dem Server verwenden, einschließlich Verschlüsselungsschlüssel usw.

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. � ...

Ist es vielversprechender, Java oder Golang von Front-End zu Back-End-Entwicklung zu verwandeln? Ist es vielversprechender, Java oder Golang von Front-End zu Back-End-Entwicklung zu verwandeln? Apr 02, 2025 am 09:12 AM

Backend Learning Path: Die Erkundungsreise von Front-End zu Back-End als Back-End-Anfänger, der sich von der Front-End-Entwicklung verwandelt, Sie haben bereits die Grundlage von Nodejs, ...

PostgreSQL -Überwachungsmethode unter Debian PostgreSQL -Überwachungsmethode unter Debian Apr 02, 2025 am 07:27 AM

In diesem Artikel werden eine Vielzahl von Methoden und Tools eingeführt, um PostgreSQL -Datenbanken im Debian -System zu überwachen, um die Datenbankleistung vollständig zu erfassen. 1. verwenden Sie PostgreSQL, um die Überwachungsansicht zu erstellen. PostgreSQL selbst bietet mehrere Ansichten für die Überwachung von Datenbankaktivitäten: PG_STAT_ACTIVITY: Zeigt Datenbankaktivitäten in Echtzeit an, einschließlich Verbindungen, Abfragen, Transaktionen und anderen Informationen. PG_STAT_REPLIKATION: Monitore Replikationsstatus, insbesondere für Stream -Replikationscluster. PG_STAT_DATABASE: Bietet Datenbankstatistiken wie Datenbankgröße, Transaktionsausschüsse/Rollback -Zeiten und andere Schlüsselindikatoren. 2. Verwenden Sie das Log -Analyse -Tool PGBADG

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 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 ...

Wie gibt ich die mit dem Modell in Beego Orm zugeordnete Datenbank an? Wie gibt ich die mit dem Modell in Beego Orm zugeordnete Datenbank an? Apr 02, 2025 pm 03:54 PM

Wie kann man im Beegoorm -Framework die mit dem Modell zugeordnete Datenbank angeben? In vielen BeEGO -Projekten müssen mehrere Datenbanken gleichzeitig betrieben werden. Bei Verwendung von BeEGO ...

See all articles