>백엔드 개발 >Golang >Go에서 길이를 알 수 없는 채널을 안전하게 닫는 방법은 무엇입니까?

Go에서 길이를 알 수 없는 채널을 안전하게 닫는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-23 17:44:14438검색

How to Safely Close a Channel of Unknown Length in Go?

길이를 알 수 없는 채널 닫기

제공된 코드에서는 여러 고루틴이 전송을 시도하기 때문에 "폐쇄된 채널에서 전송" 오류가 발생합니다. 이미 폐쇄된 채널의 가치. 이 문제는 하나의 고루틴이 채널을 닫고 다른 고루틴은 여전히 ​​데이터를 전송하고 있기 때문에 고루틴 간의 동기화 부족으로 인해 발생합니다.

이 상황에서 채널을 효과적으로 닫으려면 모든 발신자 고루틴이 언제 채널을 닫는지 확인하는 것이 중요합니다. 그들의 임무를 완료했습니다. 이는 모든 발신자 고루틴이 값 전송을 완료한 시점을 감지하기 위해 sync.WaitGroup을 사용하여 달성할 수 있습니다.

다음은 sync.WaitGroup을 사용하는 수정된 코드입니다.

func gen(ch chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    var i int
    for {
        time.Sleep(time.Millisecond * 10)
        ch <- i
        i++
        // when no more data (e.g. from db, or event stream)
        if i > 100 {
            break
        }
    }
}

func receiver(ch chan int) {
    for i := range ch {
        fmt.Println("received:", i)
    }
}

func main() {
    ch := make(chan int)
    wg := &sync.WaitGroup{}

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go gen(ch, wg)
    }

    go func() {
        wg.Wait()
        close(ch)
    }()

    receiver(ch)
}

이 솔루션에서, 각 발신자 고루틴은 sync.WaitGroup에 하나를 추가하여 채널에서 값을 보낼 것임을 나타냅니다. close() 고루틴의 wg.Wait()는 모든 송신자 고루틴이 작업을 완료한 후에만 채널이 닫히도록 보장하여 "닫힌 채널에서 보내기" 오류를 방지합니다.

위 내용은 Go에서 길이를 알 수 없는 채널을 안전하게 닫는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.