Heim  >  Artikel  >  Backend-Entwicklung  >  So synchronisieren Sie Goroutinen über Kanäle in Golang

So synchronisieren Sie Goroutinen über Kanäle in Golang

PHPz
PHPzOriginal
2023-08-15 08:17:061013Durchsuche

Golang 中 Goroutines 之间如何通过 Channels 进行同步

So synchronisieren Sie Goroutinen über Kanäle in Golang

Goroutine ist ein leichter Thread in Golang, der mehrere Aufgaben parallel in einem Programm ausführen kann. In Goroutine können wir Kanäle für die Datenkommunikation und Synchronisierung verwenden. Kanäle stellen einen Kommunikationsmechanismus zwischen Goroutinen bereit, um die Richtigkeit und Synchronisierung der Daten sicherzustellen.

In Golang sind Kanäle ein typsicheres Element, das zum Übertragen von Daten zwischen Goroutinen verwendet wird. Durch die Verwendung von Kanälen können wir eine Synchronisierung zwischen Goroutinen erreichen, um sicherzustellen, dass Daten zum richtigen Zeitpunkt und in der richtigen Reihenfolge geliefert und verarbeitet werden.

Als nächstes schauen wir uns einen Beispielcode an, um zu demonstrieren, wie Goroutine über Kanäle synchronisiert:

package main

import (
    "fmt"
    "time"
)

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        fmt.Println("Worker", id, "started job", j)
        time.Sleep(time.Second)
        fmt.Println("Worker", id, "finished job", j)
        results <- j * 2
    }
}

func main() {
    jobs := make(chan int, 100)
    results := make(chan int, 100)

    // 启动三个 Goroutine 执行任务
    for w := 1; w <= 3; w++ {
        go worker(w, jobs, results)
    }

    // 发送任务到 Jobs Channel
    for j := 1; j <= 5; j++ {
        jobs <- j
    }
    close(jobs)

    // 从 Results Channel 中接收结果
    for a := 1; a <= 5; a++ {
        <-results
    }

    time.Sleep(time.Second)
}

Im obigen Beispiel haben wir zwei Kanäle erstellt: jobs und results. <code>jobs wird verwendet, um Aufgaben an Goroutine zu senden, und results wird verwendet, um die Ergebnisse der Aufgabenausführung zu empfangen. jobsresultsjobs 用于发送任务到 Goroutine 中,而 results 用于接收任务执行的结果。

首先,我们通过使用 go 关键字来启动三个 Goroutine 并分别传递了它们所需的 jobsresults Channels。然后,我们循环发送了 5 个任务到 jobs Channel 中,并在完成后关闭了 jobs Channel。

worker 函数中,我们使用 range 关键字来不断地从 jobs Channel 中接收任务,并在处理完任务后将结果发送到 results Channel 中。由于 Channel 是阻塞的,当我们从 jobs Channel 接收到任务时,该 Goroutine 将停止并等待下一个任务的到来。

在主函数中,我们使用了 range 关键字来不断地从 results Channel 中接收结果,在任务执行完毕后,我们通过 <-results 表达式来表示我们要接收结果数据,但实际上我们不会使用这些值。

最后,在主函数中,我们使用了一个延迟函数 time.Sleep(time.Second)

Zuerst haben wir drei Goroutinen mit dem Schlüsselwort go gestartet und ihre erforderlichen Kanäle jobs und results übergeben. Dann haben wir 5 Aufgaben in einer Schleife an den Kanal jobs gesendet und den Kanal jobs nach Abschluss geschlossen.

In der Funktion worker verwenden wir das Schlüsselwort range, um kontinuierlich Aufgaben vom Kanal jobs zu empfangen und nach der Verarbeitung der Aufgaben die Ergebnisse zu erhalten werden an den results-Kanal gesendet. Da der Kanal blockiert, stoppt die Goroutine und wartet auf das Eintreffen der nächsten Aufgabe, wenn wir eine Aufgabe vom Kanal jobs erhalten.

In der Hauptfunktion verwenden wir das Schlüsselwort range, um kontinuierlich Ergebnisse vom Kanal results zu erhalten. Nachdem die Aufgabe abgeschlossen ist, übergeben wir < -Ausdruck, um anzugeben, dass wir Ergebnisdaten erhalten möchten, diese Werte jedoch nicht tatsächlich verwenden. 🎜🎜Schließlich verwenden wir in der Hauptfunktion eine Verzögerungsfunktion time.Sleep(time.Second), um sicherzustellen, dass das Programm nicht sofort nach der Ausführung der Goroutine beendet wird. 🎜🎜Anhand des obigen Beispielcodes können wir sehen, dass wir durch die Verwendung von Kanälen eine Synchronisierung zwischen Goroutinen erreichen können, um die Richtigkeit und Reihenfolge der Daten sicherzustellen. In tatsächlichen Anwendungen können wir je nach Bedarf verschiedene Arten von Kanälen erstellen, um unterschiedliche Anforderungen zu erfüllen. 🎜🎜Zusammenfassend lässt sich sagen, dass die Synchronisierung zwischen Goroutinen in Golang über Kanäle ein einfacher und leistungsstarker Mechanismus ist. Es sorgt nicht nur für die Kommunikation zwischen Threads, sondern stellt auch die Korrektheit und Synchronisierung der Daten sicher und bietet Komfort und Flexibilität bei der gleichzeitigen Programmierung. 🎜

Das obige ist der detaillierte Inhalt vonSo synchronisieren Sie Goroutinen über Kanäle in Golang. 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