La première exploration de Go - channel

Avant-propos: Récemment, je voulais entrer en contact avec distribué, alors j'ai suivi le cours MIT. Vous devez utiliser go lorsque vous faites des expériences, vous pouvez donc également consulter les caractéristiques linguistiques de go.

canal

Ce que je n'ai pas compris, c'est le problème de blocage des canaux sans tampons. Le document dit "Si le canal n'est pas tamponné, l'expéditeur se bloquera jusqu'à ce que le récepteur reçoive la valeur." Plus tard, j'ai examiné de plus près l'exemple. Soudain ouvert.

Jetons un œil à cet exemple

package main

import(
	"fmt"
	// "time"
)
func main(){
	

	go func(){
		fmt.Println("1")
	}()
	fmt.Println("2")
	fmt.Println("3")

	time.Sleep(1* time.Second)

}

Parce que la coroutine principale n'attendra pas l'exécution de la sous-coroutine, mais reviendra immédiatement pour exécuter la phrase de code suivante, donc ici nous ajoutons un sommeil au cas où la sous-coroutine n'a pas encore été exécutée et la coroutine principale s'est terminée.

Nous pouvons utiliser le canal pour réaliser la fonction du sommeil


package main

import(
	"fmt"
	// "time"
)
func main(){
	
	c := make(chan int)
	go func(){
		fmt.Println("1")
		<- c
	}()
	fmt.Println("2")
	fmt.Println("3")
	c <- 1


}

La coroutine principale envoie des données via le canal, car il n'y a pas de destinataire, la coroutine principale sera donc bloquée et la coroutine principale ne se fermera pas tant que la sous-coroutine n'aura pas fini de recevoir les données.


package main

import(
	"fmt"
	// "time"
)
func main(){
	
	c := make(chan int)
	go func(){
		fmt.Println("1")
		// <- c
	}()
	fmt.Println("2")
	fmt.Println("3")
	c <- 1


}

Si nous supprimons le code qui reçoit des données dans la sous-coroutine, un blocage se produira.

Source de référence:
https://studygolang.com/articles/12402

Je suppose que tu aimes

Origine www.cnblogs.com/yuyuan-bb/p/12723662.html
conseillé
Classement