PHpullh

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{}{} }
}

학습 팁

버퍼 크기는 생산자/소비자 속도 차이에 맞춰 설정하세요. 너무 크면 메모리 낭비, 너무 작으면 잦은 블로킹입니다.

주의할 점

버퍼 채널이 가득 찬 상태에서 보내면 블로킹됩니다. 고루틴 교착을 방지하려면 selectdefault를 사용하세요.

자주 묻는 질문

버퍼 채널란 무엇인가요?

버퍼 채널은 지정된 크기만큼 블로킹 없이 데이터를 저장합니다. 생산자와 소비자의 속도 차이를 완화합니다.

버퍼 채널 학습 시 주의할 점은 무엇인가요?

버퍼 채널이 가득 찬 상태에서 보내면 블로킹됩니다. 고루틴 교착을 방지하려면 select 와 default 를 사용하세요.