Open3
【Go】並行処理について勉強
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!
ただ、この例だとsayHello
でPrintln
が実行されるよりも前にmain関数が終了してしまう。
go
で呼び出したからといって、呼び出した関数の処理が完了することは保証されない。
main関数が先に終了してしまったら、その時点で処理は終了してしまう。
main関数内でtime.Sleep
を使って待てばsayHello
の処理も完了するかもしれないが、それも完全に保証されるわけではない。
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()
で合流ポイントを作る
参考