Heim  >  Artikel  >  Backend-Entwicklung  >  Pipeline-Kommunikation und Goroutine-Parallelitätspraxis von Golang-Funktionen

Pipeline-Kommunikation und Goroutine-Parallelitätspraxis von Golang-Funktionen

王林
王林Original
2023-05-17 13:00:22957Durchsuche

Golang ist eine effiziente Programmiersprache mit sehr leistungsstarken Funktionen zur gleichzeitigen Programmierung. Unter diesen sind Pipeline-Kommunikation und Goroutine-Parallelität zwei sehr wichtige Merkmale von Golang. In diesem Artikel stellen wir vor, wie man Pipeline-Kommunikation und Goroutine-Parallelität von Golang-Funktionen nutzt, um eine effiziente Programmierung zu erreichen.

1. Pipeline-Kommunikation

Pipeline-Kommunikation bezieht sich auf die Verwendung einer Pipeline zur Datenkommunikation in Golang. Der Produzent im Programm schreibt Daten in die Pipeline und der Verbraucher liest Daten aus der Pipeline. Der Datenaustausch zwischen verschiedenen Goroutinen wird über die Pipeline realisiert. Bei Pipes gibt es zwei Typen: gepuffert und ungepuffert.

Eine gepufferte Pipe muss beim Schreiben von Daten nicht auf das Lesen warten, sondern speichert die Daten vorübergehend in der Pipe und liest sie erneut, wenn keine Daten in der Pipe vorhanden sind. Wenn in der Pipeline zwischengespeicherte Daten vorhanden sind, können Sie mit der SELECT-Anweisung nicht blockierende Lese- und Schreibvorgänge ausführen. Ungepufferte Pipes erfordern gepaarte Schreib- und Lesevorgänge, d. h. Schreibvorgänge warten, bis ein Lesevorgang erfolgt.

Das Folgende ist ein Beispielcode, der veranschaulicht, wie Pipes verwendet werden, um die Kommunikation zwischen Produzenten und Konsumenten zu implementieren:

func main() {

ch := make(chan int)  // 创建一个整型管道
go producer(ch)       // 启动生产者函数
consumer(ch)          // 启动消费者函数

}

// Producer-Funktion, schreibt Daten in die Pipe
func Producer(ch chan int) {

for i := 0; i < 10; i++ {
    ch <- i  // 将数据写入管道
}
close(ch)  // 关闭管道

}

// Consumer-Funktion, liest Daten aus der Pipe
func Consumer(ch chan int) {

for {
    // 非阻塞式读取管道数据
    select {
    case num, ok := <-ch:  // 获取管道的值
        if ok {
            fmt.Println("Consumer received", num)  // 打印数据
        } else {
            fmt.Println("Channel closed")
            return  // 退出函数
        }
    default:
        // 没有读取到管道数据,进行其他操作
        time.Sleep(time.Second)
    }
}

}

In diesem Beispiel übergibt die Producer-Funktion die Pipe. Schreibt kontinuierlich Daten in die Pipe Rohr. Die Verbraucherfunktion liest Daten aus der Pipe über die Select-Anweisung, bei der es sich um einen nicht blockierenden Lesevorgang handelt. Wenn Daten in der Pipeline vorhanden sind, wird der Code in der Case-Anweisung ausgeführt, andernfalls wird die Standardanweisung ausgeführt, um andere Vorgänge auszuführen.

2. Goroutine-Parallelität

Die Goroutine in Golang ist ein leichter Thread, der gleichzeitig mit anderen Goroutinen ausgeführt werden kann. Die Erstellung und der Betrieb von Goroutine sind sehr effizient und können die Parallelitätsfähigkeit des Programms erheblich verbessern.

In Golang können Sie über das Schlüsselwort go eine neue Goroutine starten. Wenn das Programm mehrere Goroutinen enthält, können Datenaustausch- und Synchronisierungsvorgänge über Kanäle und andere Methoden durchgeführt werden, um eine effiziente gleichzeitige Programmierung zu erreichen.

Das Folgende ist ein Beispielcode, der veranschaulicht, wie Goroutinen zum Implementieren gleichzeitiger Operationen verwendet werden:

func main() {

ch := make(chan int)  // 创建一个整型管道
for i := 0; i < 10; i++ {
    go doWork(i, ch)  // 启动10个goroutine
}
for i := 0; i < 10; i++ {
    <-ch  // 阻塞式从管道中读取数据
}
close(ch)  // 关闭管道

}

// Arbeit für jede Ganzzahl
func doWork(i int, ch chan int ) {

fmt.Println("Doing work", i)
time.Sleep(time.Second)  // 休眠1秒
ch <- i                  // 写入整型数到管道

}

In diesem Beispiel erstellen wir 10 neue Goroutinen über das Schlüsselwort go und führen in jeder Goroutine Druckvorgänge und 1 Sekunde Schlaf aus. Nachdem jede Goroutine ihre Operation abgeschlossen hat, wird die entsprechende Ganzzahl in die Pipe geschrieben. In der Hauptfunktion verwenden wir das blockierende Lesen, um 10 Ganzzahlen aus der Pipe zu lesen, um sicherzustellen, dass jede Goroutine den Vorgang abgeschlossen hat.

Zusammenfassung

In Golang sind Pipeline-Kommunikation und Goroutine-Parallelität zwei wichtige Merkmale für eine effiziente Programmierung. Durch die Pipeline-Kommunikation können wir Daten zwischen verschiedenen Goroutinen austauschen, um eine Programmentkopplung und gleichzeitige Ausführung zu erreichen. Gleichzeitig können wir durch Goroutine-Parallelität mehrere Aufgaben gleichzeitig ausführen und die Ausführungseffizienz des Programms verbessern.

Es ist erwähnenswert, dass Sie bei der Verwendung von Pipeline-Kommunikation und Goroutine-Parallelität auf das Problem des Datenwettbewerbs achten müssen. Während der gleichzeitigen Ausführung können verschiedene Goroutinen gleichzeitig auf dieselbe Variable zugreifen. Wir müssen die atomaren Operationen oder Mutex-Sperren von Golang verwenden, um gleichzeitige Operationen auszuführen.

Ich hoffe, dieser Artikel kann Ihnen helfen, die Verwendung von Pipeline-Kommunikation und Goroutine-Parallelität besser zu verstehen und in der Praxis anzuwenden.

Das obige ist der detaillierte Inhalt vonPipeline-Kommunikation und Goroutine-Parallelitätspraxis von Golang-Funktionen. 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