Go Language
[Go] #21-3 채널(Channel) - 동기 채널
Yeom's
2023. 1. 18. 09:50
728x90
반응형
동기 채널은 이름만 보아도 알 수 있듯이 비동기 채널과 상반되는 개념이다. 원래는 동기 채널이 채널의 기본 형태지만, 비동기 채널과 버퍼의 사용을 먼저 학습하고 그 차이를 분명하게 느끼면 동기 채널에 대한 개념이 확실해질 것 같아 순서를 바꿔서 설명하게 됐다. Go 채널의 기본을 학습할 때 한 개의 송신자와 한 개의 수신자가 채널을 통해 데이터를 주고 받았다. 이때, 수신자와 송신자가 일대일 대응을 하지 않으면 한 쪽에서 무한 대기 상태가 된다고 했다. 그래서 수신자와 송신자가 여러개일 때 효율적으로 데이터를 주고 받는 방법으로 비동기 채널에서 버퍼 사용에 관해 배웠다.
동기 채널은 단순히 송/수신 채널이 여러 개여서 송신 루틴과 수신 루틴이 번갈아가면서 실행되는 것을 말한다. 채널의 기본 개념에서 벗어나지 않으니 바로 코드를 확인해보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package main
import (
"fmt"
"time"
)
func main() {
done := make(chan bool)
go func() {
for i := 0; i < 4; i++ {
done <- true
fmt.Println("고루틴 : ", i)
}
}()
for i := 0; i < 4; i++ {
<-done
fmt.Println("메인 함수 : ", i)
time.Sleep(time.Second)
}
}
|
cs |
위 코드는 단순히 채널로 데이터를 송신하고 수신함으로써 루틴을 왔다갔다 하며 실행하는 것을 보여준다. 그 모습이 눈에 보이게 하기위해 수신 루틴인 main() 함수 마지막에 time.Sleep(time.Second) 을 입력했다.
동기 채널 방식을 사용하면 송신자는 수신자가 데이터를 수신할 때까지 대기하고, 수신자는 송신자가 데이터를 송신할 때까지 대기한다. 따라서 위 그림과 같이 고루틴의 흐름을 제어할 수 있다.
728x90
반응형