Le langage Go est un langage de programmation simultanée moderne et puissant, et sa goroutine est l'une de ses fonctionnalités les plus magiques. Cet article explorera la magie des coroutines du langage Go et démontrera ses puissantes capacités de concurrence à travers des exemples de code spécifiques.
1. Qu'est-ce qu'une coroutine ?
Coroutine est un thread léger géré par l'environnement d'exécution du langage Go. Chaque coroutine Go s'exécute dans son propre espace de pile, de sorte que la surcharge liée à la création et à la destruction de coroutines est très faible. Grâce aux coroutines, une exécution simultanée peut être facilement réalisée et les performances du programme peuvent être améliorées.
2. Créer une coroutine
Dans le langage Go, utilisez le mot-clé go
pour créer une coroutine. Voici un exemple simple : go
即可创建一个协程。下面是一个简单的示例:
package main import ( "fmt" "time" ) func hello() { fmt.Println("Hello, Go!") } func main() { go hello() time.Sleep(time.Second) }
在上面的代码中,我们定义了一个hello
函数,然后在main
函数中使用go hello()
创建了一个协程。协程会在后台并发执行,输出"Hello, Go!"。同时,在main
函数中使用time.Sleep(time.Second)
来暂停主线程,以便观察协程的输出。
三、协程间通信
Go语言提供了channel
来实现协程间的通信。下面是一个简单的示例:
package main import ( "fmt" ) func producer(ch chan int) { for i := 0; i < 5; i++ { ch <- i } close(ch) } func consumer(ch chan int) { for num := range ch { fmt.Println("Received:", num) } } func main() { ch := make(chan int) go producer(ch) go consumer(ch) for { if _, ok := <-ch; !ok { break } } }
在上面的代码中,我们定义了一个producer
协程和一个consumer
协程,并通过一个channel
进行通信。producer
向channel
发送数据,consumer
从channel
接收数据并打印。最后,在main
函数中利用for
循环和close
来正确关闭channel
,实现协程的同步。
四、协程的调度
Go语言的运行时调度器会自动在逻辑处理器(Processor)和协程之间进行调度,确保协程的公平调度以及高效利用计算资源。示例如下:
package main import ( "fmt" "runtime" ) func printNumbers() { for i := 1; i <= 5; i++ { fmt.Println("Number:", i) runtime.Gosched() } } func main() { runtime.GOMAXPROCS(2) // 设置逻辑处理器数量 go printNumbers() go printNumbers() fmt.Scanln() }
在上面的代码中,我们通过runtime.GOMAXPROCS(2)
设置逻辑处理器数量为2,然后创建两个协程同时执行printNumbers
函数打印数字。在printNumbers
函数中使用runtime.Gosched()
rrreee
hello
puis utilisons go hello() dans la fonction <code>main
Création d'une coroutine. Les coroutines seront exécutées simultanément en arrière-plan et afficheront "Hello, Go!". En même temps, utilisez time.Sleep(time.Second)
dans la fonction main
pour mettre le thread principal en pause afin d'observer la sortie de la coroutine. 3. Communication entre les coroutines Le langage Go fournit un canal
pour réaliser la communication entre les coroutines. Voici un exemple simple : 🎜rrreee🎜Dans le code ci-dessus, nous définissons une coroutine producteur
et une coroutine consommateur
, et passons un canal
Communiquer . Le producteur
envoie les données au canal
et le consommateur
reçoit les données du canal
et les imprime. Enfin, utilisez la boucle for
et close
dans la fonction main
pour fermer correctement le canal
afin d'obtenir la synchronisation du coroutine. 🎜🎜4. Planification des coroutines 🎜🎜Le planificateur d'exécution du langage Go planifiera automatiquement entre le processeur logique (processeur) et la coroutine pour garantir une planification équitable de la coroutine et une utilisation efficace des ressources informatiques. Un exemple est le suivant : 🎜rrreee🎜Dans le code ci-dessus, nous définissons le nombre de processeurs logiques sur 2 via runtime.GOMAXPROCS(2)
, puis créons deux coroutines pour exécuter printNumbers<.>Function imprime les nombres. Utilisez <code>runtime.Gosched()
dans la fonction printNumbers
pour abandonner activement le processeur et donner à une autre coroutine une chance de s'exécuter. 🎜🎜5. Résumé🎜🎜À travers les exemples de code ci-dessus, nous avons exploré en profondeur la magie des coroutines du langage Go. Les capacités d'exécution légères, efficaces et simultanées des coroutines font du langage Go l'un des langages préférés pour le développement de programmes simultanés. J'espère que cet article pourra aider les lecteurs à mieux comprendre et utiliser les avantages des coroutines du langage Go et à améliorer l'efficacité et la qualité de la programmation simultanée. 🎜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!