GO · 고루틴/채널
버퍼 채널
버퍼 채널은 지정된 크기만큼 블로킹 없이 데이터를 저장합니다. 생산자와 소비자의 속도 차이를 완화합니다.
고루틴/채널중급buffered-channelsemaphoreblockingcapacity
핵심 설명
버퍼 채널은 지정된 크기만큼 블로킹 없이 데이터를 저장합니다. 생산자와 소비자의 속도 차이를 완화합니다.
Go code
package main
import "fmt"
func main() {
// 비버퍼: 송수신이 동시에 일어나야 함
unbuf := make(chan int)
go func() { unbuf <- 42 }()
fmt.Println(<-unbuf)
// 버퍼 채널: 버퍼 크기만큼 비동기 전송
buf := make(chan int, 3)
buf <- 1 // 블로킹 없음
buf <- 2
buf <- 3
// buf <- 4 // 버퍼 가득 → 블로킹!
fmt.Println(len(buf), cap(buf)) // 3 3
// 세마포어로 활용
sem := make(chan struct{}, 3) // 최대 3개 동시 실행
for i := 0; i < 10; i++ {
sem <- struct{}{} // 슬롯 획득
go func(id int) {
defer func() { <-sem }() // 슬롯 반환
fmt.Printf("작업 %d 실행\n", id)
}(i)
}
// 모든 슬롯 회수 대기
for i := 0; i < cap(sem); i++ { sem <- struct{}{} }
}학습 팁
버퍼 크기는 생산자/소비자 속도 차이에 맞춰 설정하세요. 너무 크면 메모리 낭비, 너무 작으면 잦은 블로킹입니다.
주의할 점
버퍼 채널이 가득 찬 상태에서 보내면 블로킹됩니다. 고루틴 교착을 방지하려면 select와 default를 사용하세요.
자주 묻는 질문
버퍼 채널란 무엇인가요?
버퍼 채널은 지정된 크기만큼 블로킹 없이 데이터를 저장합니다. 생산자와 소비자의 속도 차이를 완화합니다.
버퍼 채널 학습 시 주의할 점은 무엇인가요?
버퍼 채널이 가득 찬 상태에서 보내면 블로킹됩니다. 고루틴 교착을 방지하려면 select 와 default 를 사용하세요.
Continue Learning
Go 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.