Heim  >  Artikel  >  Backend-Entwicklung  > 

王林
王林Original
2024-03-18 17:09:04708Durchsuche

Golang-Coroutine-Analyse: Welche Art von Geheimnis verbirgt sich dahinter? Es sind spezifische Codebeispiele erforderlich.

In der Go-Sprache ist Coroutine (Goroutine) ein sehr wichtiges Konzept in ihrem Parallelitätsmodell. Eine Coroutine ist ein leichter Thread, der vom Laufzeitsystem der Go-Sprache geplant wird und mehrere Coroutinen gleichzeitig in einem einzelnen Thread ausführen kann. Durch Coroutinen können wir eine effiziente gleichzeitige Programmierung erreichen und die Programmleistung und Reaktionsgeschwindigkeit verbessern. Was ist also das Geheimnis hinter Golang-Coroutinen? Als Nächstes werden wir uns eingehender mit diesem Thema befassen und konkrete Codebeispiele zur Erläuterung geben.

Erstellung und Start von Coroutinen

In der Go-Sprache ist das Erstellen einer Coroutine sehr einfach. Sie müssen nur das Schlüsselwort „go“ vor dem Funktions- oder Methodenaufruf hinzufügen, um eine Coroutine zu starten. Zum Beispiel:

package main

import (
    "fmt"
)

func main() {
    go sayHello()
    fmt.Println("Main goroutine")
}

func sayHello() {
    fmt.Println("Hello from Goroutine")
}

Im obigen Code starten wir mit go sayHello() eine neue Coroutine, die die Funktion sayHello() ausführt und „Hallo von Goroutine“ ausgibt. . In der Funktion main() geben wir „Haupt-Goroutine“ aus. Diese beiden Informationen können abwechselnd ausgegeben werden, da Coroutinen gleichzeitig ausgeführt werden und es keine feste Ausführungsreihenfolge gibt. go sayHello()这样的方式来启动一个新的协程,该协程会执行sayHello()函数并打印“Hello from Goroutine”。在main()函数中,我们打印“Main goroutine”,这两个信息可能会交错输出,因为协程是并发执行的,没有固定的执行顺序。

协程的调度

Go语言的运行时系统会负责协程的调度和管理,确保多个协程能够在单个线程上并发执行。在Go语言中,有一个称为“GMP”的模型,即Goroutine、M(Machine,即操作系统线程)和P(Processor,即逻辑处理器)。通过这个模型,Go语言实现了协程的高效并发执行。

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    wg.Add(2)

    go func() {
        defer wg.Done()
        fmt.Println("Goroutine 1")
    }()

    go func() {
        defer wg.Done()
        fmt.Println("Goroutine 2")
    }()

    wg.Wait()
}

在上面的代码中,我们使用sync.WaitGroup来等待所有的协程执行完成。通过wg.Add(2)wg.Done()来分别增加和减少等待的协程数量。我们创建了两个匿名函数作为协程,分别打印“Goroutine 1”和“Goroutine 2”。在main()函数中,通过wg.Wait()来等待这两个协程执行完成。

协程间的通信

在实际的并发编程中,协程之间通常需要进行数据交换和共享数据。Go语言提供了channel来实现协程间的通信。channel是一种类型安全的通信机制,可以保证并发访问的安全性。下面是一个简单的例子:

package main

import (
    "fmt"
)

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

    go func() {
        ch <- 42
    }()

    result := <-ch
    fmt.Println(result)
}

在上面的代码中,我们创建了一个channel,并在一个协程中将整数42发送到channel中。在main()函数中,通过操作符从<code>channel

Planung von Coroutinen

Das Laufzeitsystem der Go-Sprache ist für die Planung und Verwaltung von Coroutinen verantwortlich, um sicherzustellen, dass mehrere Coroutinen gleichzeitig in einem einzelnen Thread ausgeführt werden können. In der Go-Sprache gibt es ein Modell namens „GMP“, nämlich Goroutine, M (Maschine, Betriebssystem-Thread) und P (Prozessor, logischer Prozessor). Durch dieses Modell erreicht die Go-Sprache eine effiziente gleichzeitige Ausführung von Coroutinen.

rrreee

Im obigen Code verwenden wir sync.WaitGroup, um darauf zu warten, dass alle Coroutinen die Ausführung abschließen. Verwenden Sie wg.Add(2) und wg.Done(), um die Anzahl der wartenden Coroutinen zu erhöhen bzw. zu verringern. Wir haben zwei anonyme Funktionen als Coroutinen erstellt, die „Goroutine 1“ bzw. „Goroutine 2“ ausgeben. Warten Sie in der Funktion main() auf den Abschluss der Ausführung dieser beiden Coroutinen durch wg.Wait().

Kommunikation zwischen Coroutinen

Bei der tatsächlichen gleichzeitigen Programmierung müssen Coroutinen normalerweise Daten austauschen und teilen. Die Go-Sprache bietet einen Kanal zur Realisierung der Kommunikation zwischen Coroutinen. channel ist ein typsicherer Kommunikationsmechanismus, der die Sicherheit des gleichzeitigen Zugriffs gewährleisten kann. Hier ist ein einfaches Beispiel: 🎜rrreee🎜Im obigen Code erstellen wir einen Kanal und senden die Ganzzahl 42 in einer Coroutine an den Kanal. In der Funktion main() werden Daten von channel über den Operator empfangen und ausgedruckt. 🎜🎜Das Geheimnis von Coroutinen🎜🎜Hinter Coroutinen verbergen sich viele Geheimnisse. Das wichtigste davon ist, dass teure Thread-Erstellung und Switching-Overhead vermieden werden können, wodurch eine effizientere gleichzeitige Programmierung erreicht wird. Da Coroutinen im Laufzeitsystem der Go-Sprache nach Benutzermodus geplant werden und keine Beteiligung von Betriebssystem-Threads erfordern, ist der Aufwand für das Erstellen und Wechseln von Coroutinen sehr gering. Dadurch können wir problemlos eine große Anzahl von Coroutinen erstellen, um gleichzeitige Aufgaben zu erledigen, ohne uns Gedanken über Leistungsprobleme machen zu müssen. 🎜🎜Zusammenfassung🎜🎜In der Einleitung dieses Artikels haben wir die Geheimnisse der Golang-Coroutinen eingehend erforscht und spezifische Codebeispiele gegeben, um die Erstellung, Planung und Kommunikation von Coroutinen zu erklären. Coroutinen sind ein sehr leistungsfähiges Werkzeug für die gleichzeitige Programmierung in der Go-Sprache. Durch die vollständige Nutzung von Coroutinen können wir eine effiziente gleichzeitige Programmierung erreichen und die Programmleistung und Reaktionsgeschwindigkeit verbessern. Ich hoffe, dass der Inhalt dieses Artikels den Lesern helfen kann, das relevante Wissen über Golang-Coroutinen besser zu verstehen und anzuwenden. 🎜

Das obige ist der detaillierte Inhalt von. 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
Vorheriger Artikel:Nächster Artikel: