GO · 고루틴/채널
고루틴 누수 방지
고루틴이 종료되지 않고 영원히 대기하는 누수를 방지합니다. context와 done 채널을 활용합니다.
고루틴/채널고급goroutine-leakcontextcancelcleanup
핵심 설명
고루틴이 종료되지 않고 영원히 대기하는 누수를 방지합니다. context와 done 채널을 활용합니다.
Go code
package main
import (
"context"
"fmt"
"time"
)
// 나쁜 예: 고루틴 누수
func leakyFunc() <-chan int {
ch := make(chan int)
go func() {
for i := 0; ; i++ {
ch <- i // 소비자가 없으면 영원히 블로킹
}
}()
return ch
}
// 좋은 예: context로 취소
func safeFunc(ctx context.Context) <-chan int {
ch := make(chan int)
go func() {
defer close(ch)
for i := 0; ; i++ {
select {
case ch <- i:
case <-ctx.Done():
fmt.Println("고루틴 정상 종료")
return
}
}
}()
return ch
}
func main() {
ctx, cancel := context.WithTimeout(
context.Background(), 500*time.Millisecond,
)
defer cancel()
ch := safeFunc(ctx)
for i := 0; i < 3; i++ {
fmt.Println(<-ch)
}
cancel() // 명시적 취소
time.Sleep(100 * time.Millisecond)
fmt.Println("완료")
}학습 팁
모든 고루틴에는 종료 조건이 있어야 합니다. context.Context를 전달하여 취소 가능하게 만드세요.
주의할 점
고루틴 누수는 메모리와 CPU를 지속적으로 소비합니다. runtime.NumGoroutine()으로 모니터링하세요.
자주 묻는 질문
고루틴 누수 방지란 무엇인가요?
고루틴이 종료되지 않고 영원히 대기하는 누수를 방지합니다. context 와 done 채널을 활용합니다.
고루틴 누수 방지 학습 시 주의할 점은 무엇인가요?
고루틴 누수는 메모리와 CPU를 지속적으로 소비합니다. runtime.NumGoroutine() 으로 모니터링하세요.