En Python, les générateurs sont des constructions pratiques pour créer des itérateurs. Les Goroutines dans Go offrent des fonctionnalités similaires. Voici une implémentation Go d'un générateur de style Python pour la séquence de Fibonacci :
package main import "fmt" // Fibonacci generates the Fibonacci sequence into a channel. func fibonacci(c chan int) { x, y := 1, 1 for { c <- x x, y = y, x+y } } func main() { c := make(chan int) go fibonacci(c) for i := 0; i < 10; i++ { fmt.Println(<-c) } }
Taille du tampon :
Augmentation la taille du tampon du canal (par exemple, jusqu'à 10) améliorera probablement les performances en réduisant les changements de contexte. Cependant, cela se fait au détriment de la consommation de mémoire.
Gestion de la mémoire :
Dans le code ci-dessus, la goroutine de Fibonacci s'exécute indéfiniment, en attendant les lectures du canal c . Le canal c n'est pas fermé, ce qui entraîne des fuites de mémoire. Voici une implémentation alternative qui résout ce problème :
func fib(n int) chan int { c := make(chan int) go func() { x, y := 0, 1 for i := 0; i <= n; i++ { c <- x x, y = y, x+y } close(c) }() return c }
Dans ce cas, la goroutine se termine lorsque n nombres de Fibonacci ont été générés. Le canal est fermé, ce qui entraîne son nettoyage par le ramasse-miettes.
Pour les scénarios où le nombre de valeurs générées est inconnu, envisagez d'utiliser un canal de sortie distinct pour signaler la goroutine du générateur quand s'arrêter. Ceci est décrit dans le tutoriel Golang : https://tour.golang.org/concurrency/4.
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!