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
반응형