PHpullh
학습 라이브러리/Go/고루틴 누수 방지

GO · 고루틴/채널

고루틴 누수 방지

고루틴이 종료되지 않고 영원히 대기하는 누수를 방지합니다. contextdone 채널을 활용합니다.

고루틴/채널고급goroutine-leakcontextcancelcleanup

핵심 설명

고루틴이 종료되지 않고 영원히 대기하는 누수를 방지합니다. contextdone 채널을 활용합니다.

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() 으로 모니터링하세요.

Continue Learning

Go 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.