Heim >Backend-Entwicklung >Golang >Was ist der Mechanismus für die Interaktion zwischen Golang-Funktionen und Goroutine?

Was ist der Mechanismus für die Interaktion zwischen Golang-Funktionen und Goroutine?

WBOY
WBOYOriginal
2024-05-02 18:36:02958Durchsuche

Funktion und Goroutine interagieren über die folgenden Mechanismen in der Go-Sprache: Kanal: Sicherer Datenaustausch zwischen Goroutinen. Pipe: Wird zur Kommunikation mit externen Prozessen verwendet.

Was ist der Mechanismus für die Interaktion zwischen Golang-Funktionen und Goroutine?

Funktionen in der Go-Sprache interagieren mit dem Goroutine-Mechanismus.

Goroutine-Einführung ist ein leichter Thread, der es Go-Programmen ermöglicht, Code parallel auszuführen. Es wird von der Go Runtime verwaltet und dient der parallelen Verarbeitung von Aufgaben, ohne dass Threads manuell erstellt und verwaltet werden müssen.

Interaktion zwischen Funktionen und Goroutinen

Die Interaktion zwischen Funktionen und Goroutinen in der Go-Sprache wird durch den folgenden Mechanismus erreicht:

    Kanal:
  • Ein Kommunikationsmechanismus für den sicheren Datenaustausch zwischen Goroutinen. Es handelt sich um eine typisierte Warteschlange, in der der Sender Daten in den Kanal schreibt und der Empfänger Daten daraus liest.
  • Pipe:
  • Ein spezieller Kanaltyp, der für die Kommunikation mit Befehlszeilentools oder anderen externen Prozessen entwickelt wurde.
  • Praktischer Fall: Parallele Summierung

Um die Interaktion zwischen der Funktion und Goroutine zu demonstrieren, erstellen wir ein einfaches paralleles Summierungsprogramm:

package main

import (
    "fmt"
    "math/rand"
    "sync"
    "time"
)

const numIterations = 1000000

func main() {
    sum := 0

    // 初始化互斥锁以保护并发的 sum 变量
    lock := &sync.Mutex{}

    // 创建一个通道
    c := make(chan int)

    // 创建 Goroutine 并发计算和并将结果发送到通道
    for i := 0; i < numIterations; i++ {
        go func(num int) {
            rand.Seed(time.Now().UnixNano())
            time.Sleep(time.Duration(rand.Intn(50)) * time.Millisecond)
            lock.Lock()
            defer lock.Unlock()
            sum += num
            c <- num
        }(i)
    }

    // 从通道接收数据并打印进度条
    for i := 0; i < numIterations; i++ {
        <-c
        fmt.Printf("\rProgress: %f%", float64(i)/float64(numIterations)*100)
    }

    // 等待所有 Goroutine 完成
    time.Sleep(time.Second)

    fmt.Println("\nFinal sum:", sum)
}

In diesem Programm verwenden wir Pipes und Mutex-Sperren, um die Verbindung zwischen der Funktion und Goroutine zu implementieren Interaktion:

Ein Mutex schützt Variablen, auf die gleichzeitig zugegriffen wird
    , um die Datenintegrität sicherzustellen.
  • sumGoroutine sendet das Summierungsergebnis an die Pipeline.
  • Die Hauptfunktion liest die Ergebnisse aus der Pipe und druckt den Fortschrittsbalken.
  • Durch diesen Mechanismus kann Goroutine die Summierungsaufgabe gleichzeitig ausführen und die Hauptfunktion kann den Fortschritt verfolgen und das Endergebnis erfassen.

Das obige ist der detaillierte Inhalt vonWas ist der Mechanismus für die Interaktion zwischen Golang-Funktionen und Goroutine?. 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