😺
[Go] Goroutine
Process
プロセスは、具体的なプログラムがOSによって実行されているもの。
OSは何らかのリソース(メモリなど)をプロセスと関連付け、他のプロセスがそうしたリソースにアクセスできないようにする。
Thread
一つのプロセスは、一つ以上のスレッドから構成される。
スレッドは実行の単位で、OSから決められた時間が与えられて実行される。
一つのプロセス内のスレッドがリソースへのアクセスを共有する。
一つのCPUは、同時に、あるいは複数のスレッドの命令を実行できる。
OSのワークは、スレッドの処理をスケジュールできるようにすること。
全てのプロセス(もしくはプロセス内の全てのスレッド)が、実行されるようにする必要がある。
Goroutine
package main
import (
"fmt"
"time"
)
func goroutine (s string) {
for i := 0; i <5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func normal(s string) {
for i := 0; i <5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
goroutine("World")
normal("Hello")
}
World
World
World
World
World
Hello
Hello
Hello
Hello
Hello
並行処理されている。
package main
import (
"fmt"
"time"
)
func goroutine (s string) {
for i := 0; i <5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func normal(s string) {
for i := 0; i <5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go goroutine("World")
normal("Hello")
}
World
Hello
Hello
World
World
Hello
Hello
World
World
Hello
package main
import (
"fmt"
"sync"
)
func goroutine (s string, wg *sync.WaitGroup) {
for i := 0; i <5; i++ {
// time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
wg.Done()
}
func normal(s string) {
for i := 0; i <5; i++ {
// time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
var wg sync.WaitGroup
wg.Add(1)
go goroutine("World", &wg)
normal("Hello")
wg.Wait()
}
Discussion