Maison  >  Article  >  développement back-end  >  Expérience d'application des Goroutines et des canaux dans Golang

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

PHPz
PHPzoriginal
2023-08-07 14:57:311045parcourir

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 执行完毕
}

Dans le code ci-dessus, nous utilisons go printNumbers() dans la fonction main pour démarrer une Goroutine et utiliser time. 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)
    }
}

上述代码中,我们创建了一个整型的 Channel numbers,并在 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 完成
}

上述代码中,我们创建了两个 Channels numbersdone,分别用于传递数字和完成信号。在 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 numbers et utilisons <- dans la fonction printNumbers l'opérateur envoie des données au canal. Utilisez la boucle range dans la fonction main pour 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 canaux numbers et done, qui sont utilisés respectivement pour transmettre les nombres et la complétion. . Dans les deux fonctions printNumbers et printSquares, nous implémentons l'échange de données et contrôlons l'ordre d'exécution des Goroutines via Channel. Enfin, utilisez <-done pour 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!

Déclaration:
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