14. 고루틴(Goroutines)
: "고루틴"은 Go 런타임에 의해 관리되는 경량 쓰레드 이다.
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")
}
고루틴은 동일한 주소 공간에서 실행되므로, 공유되는 자원으로의 접근은 반드시 동기화 되어야 한다. sync(https://golang.org/pkg/sync/) 패키지가 이를 위해 유용한 기본 기능을 제공한다.
14.1. 채널(Channels)
: 채널은 채널 연산자 <- 를 이용해 값을 주고 받을 수 있는, 타입이 존재하는 파이프이다. 기본적으로, 송/수신은 상대편이 준비될 때까지 블록된다. 이런 특성이 고루틴이 명시적인 락이나 조건 없이도 동기화 될 수 있도록 돕는다.
- 데이터가 화살표 방향대로 움직인다.
ch <- v // v 를 ch로 보낸다. v := <-ch // ch로부터 값을 받아서 // v 로 넘긴다. 생성방법
ch := make(chan int)go연산자로 비동기로 동작하는 고루틴의 처리 결과값을 받아 계산하는 예제이다.
package main
import "fmt"
func sum(a []int, c chan int) {
sum := 0
for _, v := range a {
sum += v
}
c <- sum // send sum to c
}
func main() {
a := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go sum(a[:len(a)/2], c)
go sum(a[len(a)/2:], c)
x, y := <-c, <-c // receive from c
fmt.Println(x, y, x+y)
}