Maison >développement back-end >Golang >Comprendre les Goroutines

Comprendre les Goroutines

Barbara Streisand
Barbara Streisandoriginal
2024-11-28 05:39:14394parcourir

Go se démarque par sa capacité à créer des applications concurrentes de manière simple et efficace. L’une des fonctionnalités qui permettent d’atteindre cet objectif est Goroutines, l’une des fonctionnalités les plus puissantes du langage. Si vous avez travaillé avec d'autres langages, vous êtes probablement familier avec les fils de discussion, mais les Goroutines sont différentes.

Que sont les Goroutines ?

Entendendo Goroutines

En bref, ce sont des fonctions ou des méthodes qui s'exécutent simultanément avec d'autres fonctions ou méthodes. Ils sont plus légers que les threads du système d'exploitation, vous pouvez donc créer des milliers de Goroutines avec beaucoup moins de frais généraux.

Que sont les Threads et pourquoi les Goroutines peuvent-elles être plus légères ?

Les threads sont essentiellement des unités d'exécution au sein d'un processus. Un processus peut avoir plusieurs threads, partageant tous le même espace mémoire mais avec leur propre pile d'exécution, qui est essentiellement une structure de données qui stocke des informations sur les fonctions actives dans un programme. Les threads du système d'exploitation sont gérés et mis à l'échelle par le système d'exploitation et ont également une limite pratique de milliers de threads par processus et une taille de pile fixe (généralement 1 Mo ou plus par thread).

Les Goroutines sont des "threads verts" ou des threads au niveau utilisateur, gérés par le runtime Go, la taille de la pile dynamique commence à seulement 2 Ko et peut s'étendre ou diminuer selon les besoins. C'est pourquoi les Goroutines peuvent être plus légères.

Qu'est-ce que la concurrence et quelle est la différence avec le parallélisme ?

Entendendo Goroutines

La concurrence est le fait de traiter plusieurs tâches en même temps, tandis que le parallélisme exécute des tâches simultanément sur plusieurs processeurs. Un peu déroutant, mais vous comprendrez mieux maintenant : la compétition implique plus de structure et d'organisation. Voir l'exemple ci-dessous :

Le parallélisme implique davantage d'exécutions, s'exécutant en même temps, voir l'exemple ci-dessous :

Que sont les chaînes ?

Entendendo Goroutines

Les canaux sont des "canaux" de communication entre Goroutines. Ils permettent aux Goroutines de communiquer et de synchroniser leur exécution. Exemple de communication entre Goroutines utilisant des canaux :

func main() {
    ch := make(chan string)

    go func() {
        ch <- "Mensagem da goroutine"
    }()

    msg := <-ch
    fmt.Println(msg)
}

Terminons maintenant avec des exemples d'utilisation des Goroutines :

// 1. Fazendo café e torrada ao mesmo tempo
func cafeDaManha() {
   fmt.Println("Iniciando café da manhã...") // 1º: Aparece primeiro

   go fazerCafe()    // 2º: "Começando a fazer café..."
   go fazerTorrada() // 3º: "Começando a fazer torrada..."

   // Espera 5 segundos para tudo ficar pronto
   time.Sleep(5 * time.Second)
   fmt.Println("Café da manhã pronto!") // Último: Aparece depois de 5 segundos
}

func fazerCafe() {
   fmt.Println("Começando a fazer café...")
   time.Sleep(3 * time.Second) 
   fmt.Println("Café pronto!") // 4º: Aparece após 3 segundos
}

func fazerTorrada() {
   fmt.Println("Começando a fazer torrada...")
   time.Sleep(2 * time.Second)
   fmt.Println("Torrada pronta!") // 5º: Aparece após 2 segundos
}

/* Saída:
Iniciando café da manhã...
Começando a fazer café...
Começando a fazer torrada...
Torrada pronta! (após 2 segundos)
Café pronto! (após 3 segundos)
Café da manhã pronto! (após 5 segundos)
*/

// 2. Contagem com Goroutines
func contagem() {
   go contar("A", 5) // Começa a contar imediatamente
   go contar("B", 5) // Começa a contar imediatamente

   time.Sleep(6 * time.Second)
}

func contar(nome string, até int) {
   for i := 1; i <= até; i++ {
       fmt.Printf("%s: %d\n", nome, i)
       time.Sleep(1 * time.Second)
   }
}

/* Saída (aproximada - as linhas A e B se misturam):
A: 1
B: 1
A: 2
B: 2
A: 3
B: 3
A: 4
B: 4
A: 5
B: 5
*/

// 3. Enviando mensagens simples
func mensagens() {
   canal := make(chan string)

   go func() {
       canal <- "Olá!"      // 1ª mensagem enviada
       canal <- "Tudo bem?" // 2ª mensagem enviada
       canal <- "Tchau!"    // 3ª mensagem enviada
   }()

   fmt.Println(<-canal) // 1º: Imprime "Olá!"
   fmt.Println(<-canal) // 2º: Imprime "Tudo bem?"
   fmt.Println(<-canal) // 3º: Imprime "Tchau!"
}

/* Saída:
Olá!
Tudo bem?
Tchau!
*/

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