Maison > développement back-end > Golang > le corps du texte

Coroutines Golang et modèle de concurrence

WBOY
Libérer: 2024-04-15 14:21:01
original
406 Les gens l'ont consulté

Les coroutines dans Go sont un mécanisme de concurrence léger qui permet d'exécuter plusieurs tâches dans le même processus. Ils partagent l'espace mémoire du processus et peuvent communiquer via des canaux. De plus, l'article fournit les éléments suivants : Création de coroutine à l'aide du mot-clé go. Les canaux sont créés avec la fonction make et peuvent être utilisés pour transmettre des valeurs entre coroutines. Le cas pratique montre comment utiliser les coroutines pour mettre en œuvre le calcul parallèle et calculer 100 000 nombres premiers via 8 coroutines.

Coroutines Golang et modèle de concurrence

Go Coroutines et modèle de concurrence

Introduction

Les coroutines sont un mécanisme de concurrence léger dans le langage Go qui permet d'exécuter plusieurs tâches indépendantes dans le même processus. Cet article explorera les coroutines et les modèles de concurrence dans Go et fournira des exemples pratiques.

Coroutines

Les coroutines sont des unités d'exécution simultanées dans le langage Go, similaires aux threads, mais plus légères. Les coroutines partagent l'espace mémoire du même processus et peuvent facilement partager des données. Créez des coroutines à l'aide du mot-clé go comme suit :

go func() {
    // 协程体
}
Copier après la connexion

Channels

Les canaux sont un mécanisme de communication dans Go qui est utilisé pour transmettre des valeurs entre les coroutines. Les canaux peuvent être unidirectionnels ou bidirectionnels et peuvent être mis en mémoire tampon ou non. Créez un canal à l'aide de la fonction make, comme indiqué ci-dessous :

ch := make(chan int, 10)
Copier après la connexion

Cas pratique : calcul parallèle

Utilisons des coroutines pour implémenter un cas pratique de calcul parallèle. Nous créons un pool de coroutines et calculons une grande table de nombres premiers dans chaque coroutine :

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)
}
Copier après la connexion

Dans ce cas, nous avons créé 8 coroutines, chacune chargée de calculer 100 000 nombres premiers. La coroutine principale est chargée de collecter les nombres premiers et de les imprimer sur la console.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal