Go 고루틴(Goroutine)
고루틴(Goroutine)
고루틴(goroutine)은 Go 언어에서의 병행 처리를 실현하는 것으로, thread보다 고속으로 병행 처리를 실행할 수 있다.
아래의 예에서는 메인의 처리를 실행하면서, 병행해 funcA()
고루틴을 go에 의해 실행하고 있다.
package main
import (
"fmt"
"time"
)
func funcA() {
for i := 0; i < 10; i++ {
fmt.Print("A")
time.Sleep(10 * time.Millisecond)
}
}
func main() {
go funcA()
for i := 0; i < 10; i++ {
fmt.Print("M")
time.Sleep(20 * time.Millisecond)
}
}
실행 결과:
MAAMAAAMAAMAAMAMMMMM
아래 예제는 채널을 사용하여 goroutine 종료를 기다리는 예이다. chan
은 채널을 생성합니다. <-
는 채널로 메시지를 주고받는다.
package main
import (
"fmt"
"time"
)
func funcA(chA chan<- string) {
time.Sleep(3 * time.Second)
chA <- "Finished" // 채널에 메시지 보내기
}
func main() {
chA := make(chan string) // 채널 생성한다.
defer close(chA) // 사용 후에는 닫는다.
go funcA(chA) // 채녈 고루틴을 반환한다.
msg := <-chA // 채널로부터 메세지를 수신한다.
fmt.Println(msg)
}
실행 결과:
Finished
다음 예제에서는 select
를 사용하여 고루틴 funcA()
와 funcB()
둘 다 대기합니다.
package main
import (
"fmt"
"time"
)
func funcA(chA chan<- string) {
time.Sleep(1 * time.Second)
chA <- "funcA Finished"
}
func funcB(chB chan<- string) {
time.Sleep(2 * time.Second)
chB <- "funcB Finished"
}
func main() {
chA := make(chan string)
chB := make(chan string)
defer close(chA)
defer close(chB)
finflagA := false
finflagB := false
go funcA(chA)
go funcB(chB)
for {
select {
case msg := <-chA:
finflagA = true
fmt.Println(msg)
case msg := <-chB:
finflagB = true
fmt.Println(msg)
}
if finflagA && finflagB {
break
}
}
}
실행 결과:
funcA Finished
funcB Finished
최종 수정 : 2023-03-26