Maison  >  Article  >  développement back-end  >  Besoin de précisions supplémentaires sur la différence entre les canaux non tamponnés (c'est-à-dire capacité 0) et les canaux tamponnés de capacité 1 dans Golang

Besoin de précisions supplémentaires sur la différence entre les canaux non tamponnés (c'est-à-dire capacité 0) et les canaux tamponnés de capacité 1 dans Golang

PHPz
PHPzavant
2024-02-14 10:15:09546parcourir

需要进一步澄清 Golang 中无缓冲通道(即容量 0)与容量 1 的缓冲通道之间的差异

l'éditeur php Banana doit clarifier davantage la différence entre les canaux non tamponnés (capacité 0) et les canaux tamponnés avec une capacité 1 dans Golang. Dans Golang, les canaux sont un mécanisme important pour la communication entre les coroutines, et les canaux sans tampon et les canaux avec tampon sont deux types de canaux. Les canaux sans tampon nécessitent que l'expéditeur et le destinataire soient prêts en même temps pour établir une communication synchrone, tandis que les canaux avec tampon permettent à l'expéditeur d'envoyer des données dans le canal même si le récepteur n'est pas prêt à les recevoir. Une meilleure compréhension des différences entre ces deux types de canaux aidera à mieux comprendre et utiliser le mécanisme de canal dans Golang.

Contenu de la question

Dans le lien ci-dessous, l'une des réponses données concernant la différence entre un canal non tamponné de 1 capacité et un canal tamponné est que seulement si le "canal est non tamponné (capacité nulle) La communication ne réussira que lorsque le l'expéditeur et le destinataire sont tous deux prêts ».

Quand l'auteur dit que l'expéditeur et le destinataire sont prêts, qu'est-ce que cela signifie exactement ? Chronologiquement, ai-je raison de dire que l’un doit précéder l’autre ? Si oui, ai-je raison de dire que le destinataire doit être prêt avant l’expéditeur ?

La différence entre la capacité du tampon de canal 0 et 1 dans Golang

J'ai essayé de trouver une explication sur les chaînes officielles et non officielles. Cependant, je n'ai pas encore trouvé de réponse satisfaisante. Le plus proche que je connaisse est l'explication ci-dessous.

Cela signifie-t-il que tout code écrit sous ch <- "C" (si capacité = 3) sera toujours exécuté ? Pour revenir à ma question initiale sur la différence entre la capacité 0 et 1, cela signifie-t-il que tout code situé en dessous de l'expéditeur ne s'exécutera pas (pour une capacité = 0) ? Par contre, si capacité = 1, même si la pleine capacité est de 1, le code ci-dessous côté expéditeur fonctionnera toujours aussi longtemps ?

https://www.golinuxcloud.com/golang-buffered-channel/

Merci !

Solution

Quand l'auteur dit que l'expéditeur et le destinataire sont prêts, qu'est-ce que cela signifie vraiment ?

Cela signifie qu'une goroutine exécute la réception et une autre goroutine exécute l'envoi. Peu importe quelle goroutine commence à fonctionner en premier.

En d'autres termes, la goroutine émettrice se bloque jusqu'à ce qu'une autre goroutine reçoive des données sur le canal.

Comparez cela à un canal mis en mémoire tampon avec une capacité disponible. Une goroutine peut terminer l'envoi vers un canal sans attendre qu'un autre goroutine reçoive sur le canal.

L'exemple ci-dessous illustre la différence entre les canaux sans tampon et avec tampon.

sleepRecv := func(c chan int) {
    time.Sleep(time.Second)
    <-c
}

b0 := make(chan int, 0)
go sleepRecv(b0)
start := time.Now()
b0 <- 0                        // must wait for recv in goroutine
fmt.Println(time.Since(start)) // prints 1s

b1 := make(chan int, 1)
go sleepRecv(b1)
start = time.Now()
b1 <- 0                        // does not wait for recv in goroutine
fmt.Println(time.Since(start)) // prints 0s

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer