😺

[Go] Goroutine

2022/10/01に公開

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