Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
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 27 28
Archives
Today
Total
관리 메뉴

Code Habit

Go ) 채널 버퍼링 본문

카테고리 없음

Go ) 채널 버퍼링

코드베어 2020. 6. 9. 09:24

채널에 버퍼 개수를 지정할 수 있다. 이를 채널 버퍼링이라 한다.

  • make(chan 자료형, 버퍼개수)
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
package main
 
import (
    "fmt"
    "runtime"
)
 
func main() {
    runtime.GOMAXPROCS(1)
 
    done := make(chan bool, 3)     // 버퍼가 2개인 비동기 채널 생성
    count := 20                   // 반복할 횟수
 
    go func() {
        for i:=0; i<count; i++ {
            done <- true        // 채널에 true를 보냄, 버퍼가 가득 차면 대기
            fmt.Println("고루틴 : ", i)    // 반복문의 변수 출력    
        }
    }()
 
    for i:=0; i<count; i++ {
        <-done                    // 버퍼에 값이 없으면 대기, 값을 꺼냄
        fmt.Println("메인 함수 : ", i)    // 반복문의 변수 출력
    }
}

채널에 버퍼를 1개 이상 설정하면 비동기 채널( asynchronous channel )이 생성된다. 비동기 채널은 보내는 쪽에서 버퍼가 가득 차면 실행을 멈추고 대기하며 받는 쪽에서는 버퍼에 값이 없으면 대기한다.

 

실행 결과

고루틴 :  0
고루틴 :  1
고루틴 :  2
고루틴 :  3
메인 함수 :  0
메인 함수 :  1
메인 함수 :  2
메인 함수 :  3
메인 함수 :  4
고루틴 :  4
고루틴 :  5
고루틴 :  6
고루틴 :  7
고루틴 :  8
메인 함수 :  5
메인 함수 :  6
메인 함수 :  7
메인 함수 :  8
메인 함수 :  9
고루틴 :  9
고루틴 :  10
고루틴 :  11
고루틴 :  12
고루틴 :  13
메인 함수 :  10
메인 함수 :  11
메인 함수 :  12
메인 함수 :  13
메인 함수 :  14
고루틴 :  14
고루틴 :  15
고루틴 :  16
고루틴 :  17
고루틴 :  18
메인 함수 :  15
메인 함수 :  16
메인 함수 :  17
메인 함수 :  18
메인 함수 :  19

실행 결과를 보면 3개의 버퍼를 생성했음에도 불구하고 channel에 더 많은 값이 들어가는 것처럼 보일 수 있는데 이는 fmt.Println 출력함수를 사용하는데 동기화가 안되어 있기 때문에 그렇게 보이는 것이고 실제 채널에는 3개까지만 채우게 된다.