Go 런타임에 의해 관리되는 경량 쓰레드입니다.
go f(x, y, z)
위와 같은 코드를 실행했다고 한다면, x, y, z 값의 평가 처리는 현재의 goroutine에서 일어나고 f의 실행은 새로운 goroutine에서 일어납니다.
goroutine은 같은 주소의 공간에서 실행되며 공유된 메모리는 synchronous(동기적)해야합니다.
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로 바로 선언하여 사용한 함수의 출력 순서가 랜덤하게 출력되는 것을 확인 할 수 있습니다.
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개임을 확인할 수 있습니다.
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)
코드를 추가하면 아래와 같이 출력이 됩니다.