[Golang] Go les bases de la langue Qu'est-ce que Goroutine?

J'ai étudié la goroutine aujourd'hui, je vais donc la publier ici!

Qu'est-ce que la Goroutine?

Goroutine est exécuté en parallèle en spécifiant une fonction dans l'instruction go!

Tout d'abord, écrivons une fonction ordinaire.


package main

import (
	"fmt"
	"time"
)

func goroutine(s string) {
	for i := 0; i < 5; i++ {
		time.Sleep(100 * time.Millisecond)
		fmt.Println(s)
	}
}

func hoge(s string) {
	for i := 0; i < 5; i++ {
		time.Sleep(100 * time.Millisecond)
		fmt.Println(s)
	}
}

func main() {
	goroutine("world")
	hoge("hello")
}
Résultat d'exécution
world
world
world
world
world
hello
hello
hello
hello
hello

C'est juste que la fonction est normalement exécutée toutes les 0,1 seconde à partir du haut.

Pour ce faire en parallèle, vous pouvez simplement préfixer le nom de la fonction avec go. ** **


(Omis parce que c'est la même chose)

func main() {
	go goroutine("world")
	hoge("hello")
}
Résultat d'exécution
hello
world
world
hello
world
hello
hello
world
world
hello

Puisqu'ils sont exécutés en parallèle, la sortie sera mixée. L'exécution simultanée peut être facilement réalisée en spécifiant simplement l'instruction go de cette manière.

Que se passe-t-il si vous commentez la partie horaire ici?


package main

import (
	"fmt"
)

func goroutine(s string) {
	for i := 0; i < 5; i++ {
		//time.Sleep(100 * time.Millisecond)
		fmt.Println(s)
	}
}

func hoge(s string) {
	for i := 0; i < 5; i++ {
		//time.Sleep(100 * time.Millisecond)
		fmt.Println(s)
	}
}

func main() {
	go goroutine("world")
	hoge("hello")
}
Résultat d'exécution
hello
hello
hello
hello
hello

Quand j'ai commenté la partie temporelle, seul bonjour était sorti. En effet, même si le thread goroutine est créé par un traitement parallèle, le traitement de la fonction principale est terminé en premier. C'est parce que la fonction goroutine s'est terminée sans être exécutée.

Gardez à l'esprit que le code du programme sera terminé même si le traitement de ** gorutine n'est pas terminé de cette manière **.

Alors, que pouvons-nous faire pour éviter cela?

Utilisez ** sync.WaitGroup **.

sync.WaitGroup


package main

import (
	"fmt"
	"sync"
)

func goroutine(s string, wg *sync.WaitGroup) {
	for i := 0; i < 5; i++ {
		fmt.Println(s)
	}
	wg.Done()
}

func hoge(s string) {
	for i := 0; i < 5; i++ {
		fmt.Println(s)
	}
}

func main() {
	var wg sync.WaitGroup
	wg.Add(1)
	go goroutine("world", &wg)
	hoge("hello")
	wg.Wait()
}

De cette façon, déclarez une variable appelée wg et décrivez qu'il existe un processus parallèle avec` `` wg.Add (1) ``. Passez l'adresse de `` wg à la fonction goroutine comme argument.

Ensuite, en écrivant wg.Wait () '', il attendra que le processus se termine jusqu'à ce que la fonction gorutine wg.Done () '' soit appelée. En écrivant de cette manière, vous pouvez éviter la fin du processus sans exécuter la fonction goroutine.

Au fait, wg.Add (1) '' attend que le processus de goroutine se termine, donc commenter wg.Done () '' entraînera une erreur.

wg.Après avoir ajouté wg.Done()Doit être appelé pour indiquer que le processus est terminé.



 La fonction goroutine peut également être écrite comme suit.

```go

func goroutine(s string, wg *sync.WaitGroup) {
	defer wg.Done()
	for i := 0; i < 5; i++ {
		fmt.Println(s)
	}
}

Si vous utilisez l'instruction defer, wg.Done () sera exécuté après la fin du traitement de la fonction, vous pouvez donc également l'écrire comme ceci.

Merci d'avoir lu jusqu'au bout!

Si vous avez des erreurs ou des impressions, veuillez commenter! !!

Recommended Posts

[Golang] Go les bases de la langue Qu'est-ce que Goroutine?
[Golang] À propos de la chaîne linguistique Go
[Golang] Principes de base du langage Go À propos du récepteur de valeur et du récepteur de pointeur
Quel type de langage de programmation est Python?
[Golang] À propos du producteur et consommateur de langue Go
Qu'est-ce que l'espace de noms
Qu'est-ce que copy.copy ()
Qu'est-ce que dotenv?
Qu'est-ce que Linux
Qu'est-ce que le klass?
Qu'est-ce que SALOME?
Aller aux bases de la classe
Pythonista nous dit "C'est un étrange langage Go"
Qu'est-ce que Linux?
Qu'est-ce que python
Qu'est-ce que l'hyperopt?
Qu'est-ce que Linux
Qu'est-ce que pyvenv
Qu'est-ce que __call__
Qu'est-ce que Linux
Qu'est-ce que Python
Qu'est-ce qu'une distribution?
Qu'est-ce que le F-Score de Piotroski?
Qu'est-ce que Raspberry Pi?
[Python] Qu'est-ce que Pipeline ...
Qu'est-ce que Calmar Ratio?
Qu'est-ce qu'un terminal?
[Tutoriel PyTorch ①] Qu'est-ce que PyTorch?
Qu'est-ce qu'un hacker?
Qu'est-ce que JSON? .. [Remarque]
À quoi sert Linux?
Qu'est-ce qu'un pointeur?
Caractéristiques du langage Go
Qu'est-ce que l'apprentissage d'ensemble?
Qu'est-ce que TCP / IP?
Qu'est-ce que __init__.py de Python?
Qu'est-ce qu'un itérateur?
Qu'est-ce que UNIT-V Linux?
[Python] Qu'est-ce que virtualenv
Qu'est-ce que l'apprentissage automatique?
[Pyro] Modélisation statistique par le langage de programmation probabiliste Pyro ① ~ Qu'est-ce que Pyro ~