l'éditeur php Youzi répondra à une question courante dans cet article : "Pourquoi le buffer de Go Channel ne limite-t-il pas correctement l'écriture/lecture ?" Lorsque nous utilisons un Channel avec un buffer, nous espérons pouvoir contrôler le comportement du programme en limitant le nombre d'opérations d'écriture ou de lecture. Cependant, en fait, le tampon Channel ne peut pas limiter directement le nombre d'opérations d'écriture/lecture. Les causes et les solutions à ce problème seront détaillées ci-dessous.
J'essaie de communiquer entre deux routines de go en utilisant des canaux. Tout d’abord, j’ai créé le canal entier, puis je l’ai passé comme paramètre à une routine go qui imprime une séquence de nombres de 0 à 10. Le résultat de ces programmes n’a aucun sens.
Voici le code principal :
func worker(identifier string, ch chan<- int) { fmt.printf("entering worker %s\n", identifier) for i := 0; i < 10; i++ { fmt.printf("writing %d\n", i) ch <- i } fmt.printf("exiting worker %s\n", identifier) close(ch) } func main() { ch := make(chan int) go worker("1", ch) for v := range ch { fmt.printf("reading %d\n", v) } }
Pour cette exécution de code, j'ai obtenu le résultat suivant :
entering worker 1 writing 0 writing 1 reading 0 reading 1 writing 2 writing 3 reading 2 reading 3 writing 4 writing 5 reading 4 reading 5 writing 6 writing 7 reading 6 reading 7 writing 8 writing 9 reading 8 reading 9 exiting worker 1
Notez qu'il y a deux exécutions en écriture suivies de deux exécutions en lecture.
Plus tard, j'ai défini une taille de tampon pour réaliser les fonctions suivantes :
func main() { ch := make(chan int, 3) // <= buffer go worker("1", ch) for v := range ch { fmt.printf("reading %d\n", v) } }
Ensuite, nous obtenons le résultat suivant :
Entering worker 1 Writing 0 Writing 1 Writing 2 Writing 3 Writing 4 Reading 0 Reading 1 Reading 2 Reading 3 Reading 4 Writing 5 Writing 6 Writing 7 Writing 8 Writing 9 Reading 5 Reading 6 Reading 7 Reading 8 Reading 9 Exiting worker 1
Notez que nous avons maintenant 5 exécutions en écriture puis 5 exécutions en lecture.
Une fois que nous avons le code et le résultat, la dernière question se pose : pourquoi ces exécutions se comportent-elles comme elles le font ? Premièrement, n'est-il pas censé lire et écrire un seul chiffre à la fois ? Au-delà de cela, pourquoi la deuxième exécution lit-elle et écrit-elle 5 nombres à chaque fois au lieu de 3 (puisque c'est la taille du tampon) ?
Vous êtes confus lors de l'impression de messages et lors de la lecture ou de l'écriture de chiffres à partir de la chaîne.
Lorsqu'une écriture se produit, aucun message « écriture » n'apparaît. Ils se produisent à un moment donné entre les écritures. De même, le message « lecture » apparaît à un moment donné entre les lectures.
Voici une façon d'organiser le premier extrait de code, qui produit le résultat affiché :
Le contrôle est constamment transmis entre main et Worker comme ceci, chacun imprimant 2 messages avant de bloquer.
De même, votre deuxième clip peut être organisé comme ceci :
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!