Maison  >  Article  >  développement back-end  >  Les Goroutines et les canaux de Golang implémentent une communication simultanée

Les Goroutines et les canaux de Golang implémentent une communication simultanée

PHPz
PHPzoriginal
2023-08-07 08:18:251364parcourir

Les goroutines et les canaux dans Golang implémentent une communication simultanée

Introduction :
Dans le développement de logiciels, la mise en œuvre d'une communication simultanée est un sujet important. Golang est un langage qui prend en charge la programmation simultanée et fournit de puissants mécanismes Goroutines et Channels pour réaliser une communication simultanée. Cet article présentera les concepts de Goroutines et de canaux et utilisera des exemples de code pour démontrer comment ils implémentent la communication simultanée.

1. Goroutines
Goroutine en Golang est un fil de discussion léger créé par le mot-clé Go. Les principales caractéristiques des Goroutines sont que leur création et leur destruction sont très rapides et que leur exécution est non bloquante, c'est-à-dire qu'une Goroutine ne bloquera pas l'exécution des autres Goroutines lors de son exécution.

Voici un exemple simple qui montre comment créer une Goroutine :

package main

import (
    "fmt"
    "time"
)

func count() {
    for i := 1; i <= 5; i++ {
        fmt.Println(i)
        time.Sleep(time.Millisecond * 500)
    }
}

func main() {
    go count()
    time.Sleep(time.Second * 3)
    fmt.Println("done")
}

Dans le code ci-dessus, la fonction count est une Goroutine. Dans la fonction main, nous utilisons le mot-clé go pour démarrer l'exécution de la fonction count sans bloquer l'exécution de la fonction main. En appelant la fonction time.Sleep, nous suspendons brièvement l'exécution de la fonction principale afin que la fonction count ait suffisamment de temps pour s'exécuter.

2. Canaux
Channel en Golang est un pipeline utilisé pour la communication entre les Goroutines. Via Channel, une Goroutine peut envoyer ou recevoir des données d'une autre Goroutine. Channel fournit des fonctionnalités de synchronisation et de blocage pour garantir un échange de données sécurisé.

Voici un exemple simple montrant comment utiliser Channel pour une communication simultanée :

package main

import (
    "fmt"
)

func sendData(data chan<- int) {
    for i := 0; i < 5; i++ {
        data <- i
    }
    close(data)
}

func receiveData(data <-chan int, done chan<- bool) {
    for num := range data {
        fmt.Println(num)
    }
    done <- true
}

func main() {
    data := make(chan int)
    done := make(chan bool)

    go sendData(data)
    go receiveData(data, done)

    <-done
}

Dans le code ci-dessus, nous définissons deux fonctions : sendData et containData. La fonction sendData est utilisée pour envoyer des données au canal et la fonction recevoirData est utilisée pour recevoir des données du canal. Dans la fonction principale, nous utilisons le mot-clé go pour démarrer respectivement l'exécution de ces deux fonctions, afin qu'elles s'exécutent simultanément.

De plus, dans la fonction principale, nous définissons le canal terminé (Channel) pour avertir le thread principal de quitter une fois la réception de toutes les données terminée. À la fin de la fonction principale, nous utilisons l'instruction <-done pour attendre les messages du canal terminé (Channel).

Grâce aux Goroutines et aux canaux, nous pouvons réaliser une exécution asynchrone et une communication sécurisée en programmation simultanée.

Conclusion :
Cet article présente les Goroutines et les canaux dans Golang et comment les utiliser pour établir une communication simultanée. Les Goroutines sont des threads légers qui sont créés et détruits très rapidement et ne bloquent pas l'exécution des autres Goroutines pendant l'exécution. Les canaux sont le mécanisme de communication utilisé entre les Goroutines. Les données sont envoyées et reçues via les canaux pour garantir la sécurité des données pour les opérations simultanées. J'espère que cet article vous aidera à comprendre la programmation simultanée dans Golang.

Référence :

  • La spécification du langage de programmation Go : https://golang.org/ref/spec
  • Un tour de Go : https://tour.golang.org/concurrency/1

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!

Déclaration:
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