[Go] Goroutines?

윤동환·2023년 7월 4일
0

Go

목록 보기
4/18
post-thumbnail

Goroutines

Go 런타임에 의해 관리되는 경량 쓰레드입니다.

go f(x, y, z)

위와 같은 코드를 실행했다고 한다면, x, y, z 값의 평가 처리는 현재의 goroutine에서 일어나고 f의 실행은 새로운 goroutine에서 일어납니다.
goroutine은 같은 주소의 공간에서 실행되며 공유된 메모리는 synchronous(동기적)해야합니다.

예제

예제 1

package main

import (
	"fmt"
	"time"
)

func f(from string) {
	for i := 0; i < 3; i++ {
		fmt.Println(from, ":", i)
	}
}

func main() {

	f("direct")

	go f("goroutine")

	go func(msg string) {
		fmt.Println(msg)
	}("going")

	time.Sleep(time.Second)
	fmt.Println("done")
}

결과

함수 f와 func로 바로 선언하여 사용한 함수의 출력 순서가 랜덤하게 출력되는 것을 확인 할 수 있습니다.

예제 2

package main

import (
	"fmt"
	"time"
)

func say(s string) {
	for i := 0; i < 5; i++ {
		time.Sleep(100 * time.Millisecond)
		fmt.Println(s)
	}
}

func main() {
	go say("world")
	say("hello")
}

fmt.Println(time.Millisecond)의 출력 값은 "1ms"로 나옵니다.
fmt.Println(time.Microsecond)의 출력 값은 "1µs"로 나옵니다.
fmt.Println(time.Nanosecond)의 출력 값은 "1ns"로 나옵니다.

결과

역시 출력 순서가 보장되지 않은것을 확인할 수 있습니다.
심지어 출력의 개수 또한 9, 10, 9, 10개임을 확인할 수 있습니다.

예제 3

package main

import (
	"fmt"
)

func say(s string) {
	for i := 0; i < 5; i++ {
		fmt.Println(s)
	}
}

func main() {
	go say("world")
	say("hello")
}

위의 코드에서 sleep구문을 제거해 보았습니다.

결과


고 루틴이 동작하기 전에 main문이 종료되어 world가 출력이 되지 않는 것을 확인할 수 있습니다.

위 구문중 say("hello")밑에

time.Sleep(time.Nanosecond)

코드를 추가하면 아래와 같이 출력이 됩니다.

reference

https://go-tour-ko.appspot.com/concurrency/1

profile
모르면 공부하고 알게되면 공유하는 개발자

0개의 댓글