GO언어 - 고루틴
고루틴(goroutine) 이란?
고루틴(goroutine)이란, 프로그램에 있는 다른 고루틴과 관련하여 독립적으로 동시에 실행되는 함수이다. 즉, Go 언어로 동시에 실행되는 모든 활동을 고루틴이라고 한다.
고 루틴을 만드는 비용은 스레드에 비해 매우 적기 때문에 경량 스레드라고 한다.
모든 프로그램은 적어도 하나의 main함수라는 고루틴을 포함하고 고루틴은 항상 백그라운드에서 작동한다.
메인 함수가 종료되면 모든 고루틴은 종료되기에 고루틴보다 main이 먼저 종료되는 것을 방지해야 한다.
고루틴(goroutine) 사용 방법
Go 언어에서는 단일 프로그램에서 여러 고루틴을 만들 수 있다.
고루틴은 prefix로 go키워드를 사용해 간단히 만들 수 있는데 일반 함수와 익명 함수로 만들 수 있다.
package main
import (
"fmt"
)
func display(str string) {
for i := 0; i < 3; i++ {
fmt.println(str)
}
}
func displayMain(str string) {
for i := 0; i < 3; i++ {
fmt.println(str)
}
}
func main() {
// 일반 함수로 고루틴 생성
go display("Welcome")
// 익명 함수로 고루틴 생성
go fun() {
for i := 0; i < 3; i++ {
fmt.Println("to")
}
}
displayMain("yoongrammer")
}
Output:
yoongrammer
yoongrammer
yoongrammer
출력 결과를 보면 고루틴 결과가 제대로 출력되지 않은 것을 볼 수 있는데, 이유는 고루틴보다 메인 함수가 먼저 종료되었기 때문이다.
이는 sleep을 통해 해결할 수 있다.
package main
import (
"fmt"
"time"
)
func display(str string) {
for i := 0; i < 3; i++ {
time.Sleep(50 * time.Millisecond)
fmt.println(str)
}
}
func displayMain(str string) {
for i := 0; i < 3; i++ {
time.Sleep(70 * time.Millisecond)
fmt.println(str)
}
}
func main() {
// 일반 함수로 고루틴 생성
go display("Welcome")
// 익명 함수로 고루틴 생성
go fun() {
for i := 0; i < 3; i++ {
time.Sleep(60 * time.Millisecond)
fmt.Println("to")
}
}
displayMain("yoongrammer")
}
Output:
Welcome
to
yoongrammer
Welcome
to
yoongrammer
Welcome
to
yoongrammer
순서대로 출력되는 것을 확인할 수 있다.
수행 흐름은 아래와 같이 진행된다.
고루틴은 동시에 수행되기 때문에 동기화가 중요하다.
여기서 고루틴끼리 데이터를 주고받을때는 채널을 이용하는 것이다.
Comments