Maison  >  Article  >  développement back-end  >  Comment implémenter la programmation asynchrone en langage Go

Comment implémenter la programmation asynchrone en langage Go

PHPz
PHPzoriginal
2023-06-04 08:10:472457parcourir

Avec le développement continu de la technologie Internet, la demande de haute simultanéité et de haute disponibilité devient de plus en plus forte. La programmation asynchrone est l’un des moyens efficaces pour améliorer l’efficacité et la réactivité du programme. En tant que langage de programmation émergent, le langage Go prend automatiquement en charge la programmation simultanée et asynchrone, ce qui facilite grandement le travail de développement des programmeurs. Cet article présentera comment implémenter la programmation asynchrone en langage Go.

1. Goroutine en langage Go

Le langage Go fournit un mécanisme goroutine qui peut facilement implémenter des opérations simultanées et asynchrones. Goroutine est un thread léger Comparé aux threads traditionnels, goroutine est « moins cher » et peut en démarrer ou en détruire des milliers en un instant. La création, la destruction et la planification de ce thread léger sont automatiquement complétées par le runtime du langage Go sans intervention manuelle.

Exemple de code :

func main() {
    go func() {
        fmt.Println("Hello, goroutine!")
    }()
    fmt.Println("main function")
    time.Sleep(time.Second)
}

Dans le code ci-dessus, une goroutine est ouverte via le mot-clé go et la chaîne "Bonjour, goroutine !" Dans la fonction principale, la « fonction principale » String est également affichée. Si la fonction time.Sleep n'est pas utilisée, le programme se terminera immédiatement et le résultat de sortie ne sera que « fonction principale » ; si time.Sleep est utilisé, le programme attendra 1 seconde et le résultat de sortie inclura « ; Bonjour, goroutine!".

2. Channel en langage Go

goroutine est la base de la programmation asynchrone en langage Go, et le canal est le pont de communication entre les goroutines. Un canal est un mécanisme utilisé pour communiquer entre les goroutines. Grâce aux canaux, l'échange de données et la collaboration entre différentes goroutines peuvent être réalisés.

Les chaînes en langage Go sont divisées en deux types : les chaînes avec cache et les chaînes sans cache. Un canal avec cache a une certaine capacité et peut mettre en cache un certain nombre d'éléments. Un canal sans cache doit attendre que l'émetteur et le récepteur soient prêts avant que l'échange de données puisse avoir lieu.

Exemple de code :

// 带缓存的channel
func main() {
    c := make(chan int, 3)
    c <- 1
    c <- 2
    c <- 3
    fmt.Println(<-c)
    fmt.Println(<-c)
    fmt.Println(<-c)
}

// 不带缓存的channel
func main() {
    c := make(chan int)
    go func() {
        c <- 1
        c <- 2
        c <- 3
    }()
    fmt.Println(<-c)
    fmt.Println(<-c)
    fmt.Println(<-c)
}

Dans le canal avec cache, un canal avec une capacité tampon de 3 est créé via la fonction make, et les trois nombres 1, 2 et 3 sont envoyés au canal dans l'ordre et transmis <-c pour lire les données. Dans un canal sans mise en cache, les trois nombres 1, 2 et 3 sont envoyés au canal via une goroutine et les données sont lues via <-c.

3. L'instruction select en langage Go

L'instruction select est l'une des instructions importantes du langage Go pour implémenter la programmation asynchrone. Elle peut choisir entre plusieurs canaux pour réaliser des opérations d'attente et de réception de données asynchrones. Lorsque plusieurs canaux sont prêts, l'instruction select sélectionne de manière aléatoire un canal disponible pour effectuer l'opération. S'il n'y a pas de canal disponible, l'instruction select se mettra en veille jusqu'à ce qu'un canal soit prêt.

Exemple de code :

// select语句
func main() {
    c1 := make(chan int)
    c2 := make(chan int)
    go func() {
        time.Sleep(time.Second)
        c1 <- 1
    }()
    go func() {
        time.Sleep(time.Second)
        c2 <- 2
    }()
    select {
    case n := <-c1:
        fmt.Println(n)
    case n := <-c2:
        fmt.Println(n)
    }
}

Dans le code ci-dessus, les données sont envoyées à deux canaux différents via deux goroutines, et les données sont attendues via l'instruction select. Puisqu'elle dort pendant 1 seconde, l'instruction select attendra 1 seconde pour que les données d'un côté soient prêtes.

4. async/await en langage Go

La syntaxe async/wait en langage Go n'a pas de mots-clés indépendants comme les autres langages de programmation. Mais un modèle de programmation asynchrone similaire peut être implémenté en utilisant des goroutines et des instructions select. Par exemple, dans le code suivant, async et wait sont utilisés pour simuler le modèle de programmation asynchrone.

Exemple de code :

// 异步编程模型
func main() {
    task := func() (int, error) {
        return 1, nil
    }
    async := func() chan int {
        c := make(chan int)
        go func() {
            n, err := task()
            if err != nil {
                panic(err)
            }
            c <- n
        }()
        return c
    }
    await := func(c chan int) int {
        return <-c
    }
    fmt.Println(await(async()))
}

Dans cet exemple de code, une fonction qui doit être appelée de manière asynchrone est simulée via la fonction de tâche. Asynchronisez cette fonction via la fonction async et renvoyez un canal. Enfin, utilisez la fonction wait pour attendre les résultats dans le canal et revenir. Bien que le code semble avoir ajouté de nombreux frameworks supplémentaires, il simule toujours bien le modèle de programmation asynchrone.

Résumé

En tant que langage de programmation émergent, le langage Go prend intrinsèquement en charge la programmation simultanée et asynchrone, ce qui facilite grandement le travail de développement des programmeurs. Une programmation asynchrone efficace peut être facilement mise en œuvre en utilisant des goroutines, des canaux, des instructions select et le modèle async/await. À l’avenir, nous pouvons nous attendre à ce que le langage Go prenne mieux en charge la programmation asynchrone afin de mieux répondre aux besoins des scénarios d’application à haute concurrence et haute disponibilité.

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