Heim  >  Artikel  >  Backend-Entwicklung  >  Golang-Coroutinen und Parallelitätsmodell

Golang-Coroutinen und Parallelitätsmodell

WBOY
WBOYOriginal
2024-04-15 14:21:01339Durchsuche

Coroutinen in Go sind ein leichter Parallelitätsmechanismus, der die Ausführung mehrerer Aufgaben im selben Prozess ermöglicht. Sie teilen sich den Prozessspeicherplatz und können über Kanäle kommunizieren. Darüber hinaus bietet der Artikel Folgendes: Coroutine-Erstellung mit dem Schlüsselwort „go“. Kanäle werden mit der Make-Funktion erstellt und können zum Übergeben von Werten zwischen Coroutinen verwendet werden. Der praktische Fall zeigt, wie man Coroutinen verwendet, um paralleles Rechnen zu implementieren und 100.000 Primzahlen mithilfe von 8 Coroutinen zu berechnen.

Golang-Coroutinen und Parallelitätsmodell

Go-Coroutinen und Parallelitätsmodell

Einführung

Coroutinen sind ein leichter Parallelitätsmechanismus in der Go-Sprache, der die Ausführung mehrerer unabhängiger Aufgaben im selben Prozess ermöglicht. In diesem Artikel werden Coroutinen und Parallelitätsmodelle in Go untersucht und praktische Beispiele bereitgestellt.

Coroutinen

Coroutinen sind gleichzeitige Ausführungseinheiten in der Go-Sprache, ähnlich wie Threads, aber leichter. Coroutinen teilen sich den Speicherplatz desselben Prozesses und können problemlos Daten austauschen. Erstellen Sie Coroutinen mit dem Schlüsselwort go wie folgt:

go func() {
    // 协程体
}

Channels

Channels sind ein Kommunikationsmechanismus in Go, der zum Übergeben von Werten zwischen Coroutinen verwendet wird. Kanäle können unidirektional oder bidirektional sein und können gepuffert oder ungepuffert sein. Erstellen Sie einen Kanal mit der Make-Funktion, wie unten gezeigt:

ch := make(chan int, 10)

Übungsfall: Paralleles Rechnen

Lassen Sie uns Coroutinen verwenden, um einen praktischen Fall des parallelen Rechnens zu implementieren. Wir erstellen einen Pool von Coroutinen und berechnen in jeder Coroutine eine große Tabelle mit Primzahlen:

package main

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

const primeCount = 100000

// 计算素数
func isPrime(n int) bool {
    if n <= 1 {
        return false
    }
    for i := 2; i*i <= n; i++ {
        if n%i == 0 {
            return false
        }
    }
    return true
}

// 协程函数
func parallelPrimes(ch chan int) {
    for i := 0; i < primeCount; i++ {
        n := rand.Intn(100000)
        if isPrime(n) {
            ch <- n
        }
    }
}

func main() {
    // 创建通道和协程池
    ch := make(chan int, primeCount)
    for i := 0; i < 8; i++ {
        go parallelPrimes(ch)
    }

    // 等待协程池完成
    close(ch)

    start := time.Now()
    // 收集素数
    for prime := range ch {
        fmt.Println(prime)
    }
    elapsed := time.Since(start)
    fmt.Printf("Elapsed time: %v\n", elapsed)
}

In diesem Fall haben wir 8 Coroutinen erstellt, von denen jede für die Berechnung von 100.000 Primzahlen verantwortlich ist. Die Haupt-Coroutine ist dafür verantwortlich, Primzahlen zu sammeln und sie auf der Konsole auszugeben.

Das obige ist der detaillierte Inhalt vonGolang-Coroutinen und Parallelitätsmodell. 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:Golang-Coroutinen und AsyncioNächster Artikel:Golang-Coroutinen und Asyncio