Open3

【Go】並行処理について勉強

aa

goroutine

package main

import (
	"fmt"
	"time"
)

func main() {
	go sayHello()
	fmt.Println("Hello from main!")
}

func sayHello() {
	time.Sleep(1 * time.Second)
	fmt.Println("Hello, World!")
}

呼び出したい関数の前にgoと書くだけで並行処理ができる。簡単。
上の例では、main関数内でsayHelloを呼び出し1秒間待っている間にmain関数内のPrintlnが先に実行される。

Hello from main!

ただ、この例だとsayHelloPrintlnが実行されるよりも前にmain関数が終了してしまう。

goで呼び出したからといって、呼び出した関数の処理が完了することは保証されない。
main関数が先に終了してしまったら、その時点で処理は終了してしまう。

main関数内でtime.Sleepを使って待てばsayHelloの処理も完了するかもしれないが、それも完全に保証されるわけではない。

aa

gorouineの合流ポイントを作る

package main

import (
	"fmt"
	"sync"
	"time"
)

var wg sync.WaitGroup

func main() {
	wg.Add(1)
	go sayHello()

	fmt.Println("Hello from main!")

	wg.Wait()
}

func sayHello() {
	defer wg.Done()
	time.Sleep(1 * time.Second)
	fmt.Println("Hello, World!")
}

wg.Wait()で合流ポイントを作る