Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- write
- FOR
- Sync
- Golang
- windows
- json
- API
- go
- window
- c++
- install
- http
- Python
- range
- go언어
- Linux
- 영화
- tcp
- 리뷰
- JavaScript
- Callback
- mutex
- bitcoin
- package
- 책
- GO 언어
- Close
- File
- C
- channel
Archives
- Today
- Total
Code Habit
Go ) 채널 버퍼링 본문
채널에 버퍼 개수를 지정할 수 있다. 이를 채널 버퍼링이라 한다.
- 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개까지만 채우게 된다.