[Golang] Go Sprachgrundlagen Was ist Goroutine?

Ich habe heute Goroutine studiert, also werde ich es hier ausgeben!

Was ist Goroutine?

Goroutine wird parallel ausgeführt, indem eine Funktion in der go-Anweisung angegeben wird!

Schreiben wir zunächst eine gewöhnliche Funktion.


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")
}
Ausführungsergebnis
world
world
world
world
world
hello
hello
hello
hello
hello

Dies ist nur so, dass die Funktion normalerweise alle 0,1 Sekunden von oben ausgeführt wird.

Dazu können Sie dem Funktionsnamen einfach go voranstellen. ** ** **


(Ausgelassen, weil es das gleiche ist)

func main() {
	go goroutine("world")
	hoge("hello")
}
Ausführungsergebnis
hello
world
world
hello
world
hello
hello
world
world
hello

Da sie parallel ausgeführt werden, wird die Ausgabe gemischt. Die gleichzeitige Ausführung kann einfach erreicht werden, indem die go-Anweisung auf diese Weise angegeben wird.

Was passiert, wenn Sie den Zeitteil hier auskommentieren?


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")
}
Ausführungsergebnis
hello
hello
hello
hello
hello

Als ich den Zeitteil auskommentierte, wurde nur Hallo ausgegeben. Dies liegt daran, dass selbst wenn der Goroutine-Thread durch Parallelverarbeitung erstellt wird, die Verarbeitung der Hauptfunktion zuerst abgeschlossen ist. Dies liegt daran, dass die Goroutine-Funktion beendet wurde, ohne ausgeführt zu werden.

Beachten Sie, dass der Code des Programms auch dann beendet wird, wenn die Verarbeitung von ** Gorutine auf diese Weise nicht abgeschlossen ist **.

Was können wir also tun, um dies zu vermeiden?

Verwenden Sie ** 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()
}

Deklarieren Sie auf diese Weise eine Variable namens "wg" und beschreiben Sie, dass es einen parallelen Prozess mit "wg.Add (1)" gibt Übergeben Sie die Adresse von `` `wg``` als Argument an die Goroutine-Funktion.

Dann wird durch Schreiben von `wg.Wait ()` gewartet, bis der Prozess beendet ist, bis die Gorutine-Funktion `wg.Done ()` aufgerufen wird. Wenn Sie auf diese Weise schreiben, können Sie vermeiden, dass der Prozess endet, ohne die Goroutine-Funktion auszuführen.

Übrigens wartet `wg.Add (1)` darauf, dass der Goroutine-Prozess abgeschlossen ist. Wenn Sie also `` wg.Done () `auskommentieren, wird ein Fehler angezeigt.

wg.Nach dem Hinzufügen von wg.Done()Sollte aufgerufen werden, um anzuzeigen, dass der Vorgang abgeschlossen ist.



 Die Goroutine-Funktion kann auch wie folgt geschrieben werden.

```go

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

Wenn Sie die defer-Anweisung verwenden, wird wg.Done () ausgeführt, nachdem die Funktion die Verarbeitung abgeschlossen hat, sodass Sie sie auch so schreiben können.

Vielen Dank für das Lesen bis zum Ende!

Wenn Sie Fehler oder Eindrücke haben, kommentieren Sie bitte! !!

Recommended Posts

[Golang] Go Sprachgrundlagen Was ist Goroutine?
[Golang] Über den Sprachkanal Go
[Golang] Grundlagen der Go-Sprache Über Wertempfänger und Zeigerempfänger
Was für eine Programmiersprache ist Python?
[Golang] Über Go-Sprache Produzent und Konsument
Was ist ein Namespace?
Was ist copy.copy ()
Was ist dotenv?
Was ist Linux?
Was ist klass?
Was ist SALOME?
Gehen Sie zu den Grundlagen des Unterrichts
Pythonista sagt uns "Das ist eine seltsame Go-Sprache"
Was ist Linux?
Was ist Python?
Was ist Hyperopt?
Was ist Linux?
Was ist Pyvenv?
Was ist __call__?
Was ist Linux?
Was ist Python?
Was ist eine Distribution?
Was ist Piotroskis F-Score?
Was ist Raspberry Pi?
[Python] Was ist Pipeline ...
Was ist das Calmar-Verhältnis?
Was ist ein Terminal?
[PyTorch Tutorial ①] Was ist PyTorch?
Was ist ein Hacker?
Was ist JSON? .. [Hinweis]
Wofür ist Linux?
Was ist ein Zeiger?
Funktionen der Go-Sprache
Was ist Ensemble-Lernen?
Was ist TCP / IP?
Was ist Pythons __init__.py?
Was ist ein Iterator?
Was ist UNIT-V Linux?
[Python] Was ist virtualenv?
Was ist maschinelles Lernen?
[Pyro] Statistische Modellierung mit der probabilistischen Programmiersprache Pyro ~ What is Pyro ~