Go by Example: [22] GoRoutines
Goroutines
goroutine
은 경량적인 실행 스레드이며, Go
언어차원에서 지원하는 병렬실행 기능입니다.
package main
import "fmt"
func f(from string) {
for i := 0; i < 3; i++ {
fmt.Println(from, ":", i)
}
}
func main() {
f("direct") // [1]
go f("goroutine") // [2]
go func(msg string) { // [3]
fmt.Println(msg)
}("going")
var input string
fmt.Scanln(&input) // [4]
fmt.Println("done")
}
f(s)
함수를 일반적으로 호출하고 있습니다. 동기적으로 작동하는지를 보기위해서 호출한 것입니다.goroutine
을go
키워드를 사용하여 호출했습니다. 고루틴은 병렬적으로 실행됩니다.- 익명함수를 생성한 후, 고루틴으로 실행할 수도 있습니다.
- 현재 2개의 함수는 고루틴에 의해서 비동기적으로 호출되고 있습니다.
main()
함수 또한 고루틴입니다.
호출 및 실행순서를 보기위해서main()
함수 고루틴을fmt.Scanln()
함수를 사용하여, 사용자로 부터
입력을 대기하게 한 것입니다. 이 부분이 없다면 실행하자말자 종료해버립니다.
실행하면 다음과 같습니다.
$ go run goroutines.go
direct : 0
direct : 1
direct : 2
goroutine : 0
going
goroutine : 1
goroutine : 2
<enter>
done
프로그램이 실행되면서 처음 일반적인 f(direct)
함수가 실행된 뒤에, 고루틴이 동시에 실행됨을
알 수 있습니다. 하지만 순서는 일관되지 않습니다. 이런 동시실행기능은 시스템 리소스를 적게 먹으면서도,
Go
언어 엔진차원에서 기본적으로 제공하는 기능중 하나입니다. (경량쓰레드와 유사합니다.)
다음으로는 프로그램에서 고루틴이 가장많이 사용되는 채널(channels)
에 대해서 알아보겠습니다.