Maison> développement back-end> Golang> le corps du texte

Expérience d'application des Goroutines et des canaux dans Golang

PHPz
Libérer: 2023-08-07 14:57:31
original
1011 Les gens l'ont consulté

Golang 中 Goroutines 和 Channels 的应用心得

Expérience d'application des Goroutines et des canaux dans Golang

Golang est un langage de programmation multiplateforme avec des performances efficaces et une syntaxe concise. Les Goroutines et les canaux sont deux caractéristiques importantes de sa programmation simultanée. Cet article partagera quelques expériences d'utilisation des Goroutines et des canaux dans des applications pratiques et les démontrera à travers des exemples de code.

Tout d'abord, les Goroutines sont des threads légers dans Golang qui peuvent s'exécuter de manière asynchrone. En ajoutant le mot-clé "go" avant l'appel de fonction, le bloc de code de fonction peut être encapsulé dans un Goroutine. Voici un exemple simple :

package main import ( "fmt" "time" ) func printNumbers() { for i := 1; i <= 5; i++ { fmt.Println(i) } } func main() { go printNumbers() // 启动一个 Goroutine time.Sleep(1 * time.Second) // 等待 Goroutine 执行完毕 }
Copier après la connexion

Dans le code ci-dessus, nous utilisonsgo printNumbers()dans la fonctionmainpour démarrer une Goroutine et utilisertime.pour attendre la fin de l'exécution de Goroutine. De cette façon, pendant l'exécution de Goroutine, le thread principal peut continuer à effectuer d'autres tâches.main函数中使用go printNumbers()启动了一个 Goroutine,并使用time.Sleep函数来等待 Goroutine 的执行完毕。这样就可以在 Goroutine 执行的同时,主线程也可以继续执行其他任务。

接下来,Channels 是 Golang 中用于 Goroutines 之间通信的机制。可以将 Channel 看作是一条管道,Goroutine 可以将数据发送到 Channel 中,而其他 Goroutine 则可以从 Channel 中接收数据。下面是一个简单的示例:

package main import ( "fmt" ) func printNumbers(numbers chan int) { for i := 1; i <= 5; i++ { numbers <- i // 发送数据到 Channel } close(numbers) // 关闭 Channel } func main() { numbers := make(chan int) go printNumbers(numbers) for number := range numbers { // 从 Channel 中接收数据 fmt.Println(number) } }
Copier après la connexion

上述代码中,我们创建了一个整型的 Channelnumbers,并在printNumbers函数中使用<-操作符发送数据到该 Channel 中。在main函数中使用range循环从 Channel 中接收数据,这里需要注意的是,当 Channel 被关闭后,循环会自动退出。

除了在 Goroutines 之间传递数据,Channels 还可以用于控制 Goroutines 的执行顺序。下面是一个使用两个 Channels 实现的简单示例:

package main import ( "fmt" ) func printNumbers(numbers chan int, done chan bool) { for i := 1; i <= 5; i++ { numbers <- i // 发送数据到 Channel } done <- true // 发送完成信号到 done Channel } func printSquares(numbers chan int, done chan bool) { for number := range numbers { // 从 numbers Channel 中接收数据 fmt.Println(number * number) } done <- true // 发送完成信号到 done Channel } func main() { numbers := make(chan int) done := make(chan bool) go printNumbers(numbers, done) go printSquares(numbers, done) <-done // 等待 printNumbers Goroutine 完成 <-done // 等待 printSquares Goroutine 完成 }
Copier après la connexion

上述代码中,我们创建了两个 Channelsnumbersdone,分别用于传递数字和完成信号。在printNumbersprintSquares两个函数中,我们通过 Channel 的方式实现了数据的交换和控制 Goroutines 的执行顺序。最后通过<-done

Ensuite, les canaux sont le mécanisme de Golang pour la communication entre les Goroutines. Un canal peut être considéré comme un canal. Les Goroutines peuvent envoyer des données au canal, et d'autres Goroutines peuvent recevoir des données du canal. Voici un exemple simple :

rrreee

Dans le code ci-dessus, nous créons un canal entier numberset utilisons <- dans la fonctionprintNumbersl'opérateur envoie des données au canal. Utilisez la boucle rangedans la fonction mainpour recevoir des données du canal. Il convient de noter que lorsque le canal est fermé, la boucle se ferme automatiquement.

En plus de transmettre des données entre Goroutines, les canaux peuvent également être utilisés pour contrôler l'ordre d'exécution des Goroutines. Ce qui suit est un exemple simple implémenté en utilisant deux canaux :
    rrreee
  1. Dans le code ci-dessus, nous avons créé deux canauxnumbersetdone, qui sont utilisés respectivement pour transmettre les nombres et la complétion. . Dans les deux fonctionsprintNumbersetprintSquares, nous implémentons l'échange de données et contrôlons l'ordre d'exécution des Goroutines via Channel. Enfin, utilisez<-donepour bloquer le thread principal et attendez que les deux Goroutines terminent leur exécution.
  2. Grâce à l'exemple de code ci-dessus, nous pouvons voir les fonctions puissantes des Goroutines et des canaux pour réaliser une programmation simultanée efficace dans Golang. Bien entendu, les applications de Goroutines et de Channels ne se limitent pas aux exemples ci-dessus. En fonction des besoins et des scénarios réels, nous pouvons utiliser ces deux fonctionnalités de manière flexible pour améliorer les performances et la concurrence du programme.
  3. Dans les applications pratiques, nous devons prêter attention aux points suivants :

Lors de l'utilisation de Goroutines, veillez à contrôler le nombre de concurrences pour éviter qu'un excès de Goroutines ne provoque un épuisement des ressources du système.

Lorsque vous utilisez des canaux pour le transfert de données, utilisez une taille de tampon appropriée pour équilibrer la vitesse d'envoi et de réception afin d'éviter une impasse ou un blocage grave. Après la fermeture de la chaîne, évitez de continuer à lui envoyer des données, sinon cela provoquerait la panique. En résumé, Goroutines et Channels sont de puissantes fonctionnalités de programmation simultanée dans Golang. Leur utilisation appropriée peut améliorer les performances et les capacités de concurrence du programme. Grâce à la démonstration d'un exemple de code, nous avons une compréhension plus claire de l'utilisation des Goroutines et des canaux. Dans les applications réelles, nous devons choisir et utiliser ces deux fonctionnalités de manière flexible pour obtenir une programmation simultanée efficace basée sur les besoins et les scénarios.

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!