[Golang] À propos du producteur et consommateur de langue Go

Aujourd'hui, j'ai découvert le producteur et le consommateur de Go, alors je vais en sortir.

Connaissances préalables

Je pense que cet article sera plus facile à comprendre si vous avez des connaissances à ce sujet. Si vous ne comprenez pas, j'ai également écrit un article sur les chaînes et Goroutine, alors veuillez vous y référer si vous le souhaitez! [Golang] À propos de la chaîne linguistique Go [Golang] Go Bases de la langue Qu'est-ce que Goroutine?

Que sont le producteur et le consommateur?

Tout d'abord, veuillez consulter la figure ci-dessous. スクリーンショット 2020-09-30 223000.png

Le flux est que le résultat du traitement du traitement parallèle (Producer) exécuté à partir de func main est envoyé au canal et la valeur envoyée est traitée par Consumer. Plus précisément, il semble être utilisé en allant sur différents serveurs, en analysant le journal, en envoyant le résultat sur le canal (Producer), en recevant la valeur du canal envoyé sur le consommateur, et en le traitant!

Vous ne pouvez pas le comprendre uniquement à partir de mots, alors écrivons le code.


package main

import (
	"fmt"
	"sync"
)

func producer(ch chan int, i int) {
	//Certains traitements
	ch <- i * 2
}

func consumer(ch chan int, wg *sync.WaitGroup) {
	for i := range ch {
		fmt.Println("process", i*100)
		wg.Done()
	}
}

func main() {
	var wg sync.WaitGroup
	ch := make(chan int)

	//Producer
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go producer(ch, i)
	}

	//Consumer
	go consumer(ch, &wg)
	wg.Wait()
	close(ch)
}
**Résultat d'exécution**
process 0
process 400
process 200
process 600
process 800
process 1000
process 1200
process 1400
process 1600
process 1800

Tout d'abord, créez une variable wg et un canal et stockez-les dans la variable ch. Générez maintenant ** Producer **. Le nombre de processus parallèles est incrémenté en définissant wg.Add (1). (Je dis à wg qu'il y a 10 processus parallèles car je boucle 10 fois ici) Ensuite, passez ch et i comme arguments à la ** fonction de producteur ** et attachez une instruction go pour exécuter le traitement parallèle.

La ** fonction de producteur ** fait quelque chose et envoie le ** i * 2 ** au canal. Ensuite, lorsque le traitement est terminé, transmettez les adresses de ch et wg à la ** fonction consommateur **. La ** fonction consommateur ** prend la valeur de canal envoyée par la ** fonction producteur ** et la boucle avec la plage. Le contenu du traitement en boucle sort i * 1000, et wg.Done indique que ce traitement est terminé. Ceci est répété 10 fois.

Lorsque cela est fait, allez à wg.Wait (ici, attendez que le processus soit terminé 10 fois) ** Close (ch) pour décrire que le canal est fermé. ** **

En guise d'avertissement ici, ** le consommateur lui-même est Goroutine, donc même après 10 fois de traitement, il essaie toujours d'obtenir la valeur du canal, en attendant que le canal soit envoyé par la fonction de producteur pour tourner la plage. Je vais. ** ** Vous pouvez voir que la fonction producteur envoie la valeur au canal 10 fois, mais la fonction consommateur ne sait pas que 10 valeurs sont envoyées. Il essaiera de parcourir la valeur suivante à moins qu'il ne signale la fin du canal. Comme c'est sain d'esprit! .. Par conséquent, il est nécessaire de décrire que le canal est fermé en réglant "close (ch)" que "Plus aucune valeur ne sera envoyée par la fonction producteur"!

Merci d'avoir lu jusqu'au bout!

J'espère que cet article vous a aidé à comprendre! Nous vous serions reconnaissants de bien vouloir commenter vos impressions et suggestions!

Recommended Posts

[Golang] À propos du producteur et consommateur de langue Go
[Golang] Principes de base du langage Go À propos du récepteur de valeur et du récepteur de pointeur
À propos de _ et __
[Golang] Go les bases de la langue Qu'est-ce que Goroutine?
À propos des fonctions Go
À propos de l'interface Go
Aller à la langue pour voir et se souvenir du langage Partie 7 C en langage GO
En savoir plus sur les tranches Go
Erreur de Golang et panique
À propos de la syntaxe de contrôle Go
Caractéristiques du langage Go
À propos des modules Go (vgo)
À propos de la validation croisée et de la valeur F
[Go language] Collectez et enregistrez des images Vtuber à l'aide de l'API Twitter
Aller au langage pour voir et se souvenir de la partie 8 Appeler le langage GO à partir de Python