>백엔드 개발 >Golang >WaitGroup을 사용하여 모든 고루틴이 완료된 후 어떻게 채널을 안전하게 닫을 수 있나요?

WaitGroup을 사용하여 모든 고루틴이 완료된 후 어떻게 채널을 안전하게 닫을 수 있나요?

Linda Hamilton
Linda Hamilton원래의
2024-12-22 05:57:13674검색

How Can We Safely Close a Channel After All Goroutines Have Completed Using a WaitGroup?

WaitGroup으로 고루틴 완료 후 채널 닫기

채널 및 고루틴으로 작업할 때 모든 고루틴이 완료된 후 채널을 닫는 것이 필수적입니다. 이렇게 하면 채널에서 추가 통신이 방지되고 리소스 관리가 원활해집니다.

제공된 코드는 이 동작을 구현하려고 시도하지만 경쟁 조건으로 인해 제한에 직면합니다. 이러한 문제를 해결하기 위해 sync.WaitGroup 유형을 활용할 수 있습니다.

WaitGroup을 사용하면 작업 모음을 생성하고 실행을 계속하기 전에 작업이 완료될 때까지 기다릴 수 있습니다. 채널을 닫는 상황에서 WaitGroup을 사용하면 모든 고루틴의 사용이 완료된 경우에만 채널이 닫히도록 할 수 있습니다.

WaitGroup을 사용하여 개선된 코드 조각:

import (
    "sync"
)

// ...

var wg sync.WaitGroup
for i := 0; i <= 10; i++ {
    wg.Add(1)
    go func() {
        result := calculate()
        c <- result
        wg.Done()
    }()
}

// Close the channel when all goroutines are finished
go func() {
    wg.Wait()
    close(c)
}()

for result := range c {
    all_result = append(all_result, result...)
}

이 업데이트된 코드에서는 WaitGroup을 사용하여 뛰어난 고루틴 수를 추적합니다. 작업을 실행하는 각 고루틴은 WaitGroup 카운터를 증가시켜 시작되었음을 나타냅니다. 완료되면 각 고루틴은 WaitGroup 카운터를 감소시켜 완료되었음을 나타냅니다. 별도의 고루틴은 WaitGroup을 기다리고 모든 고루틴이 완료를 보고하면 채널을 닫습니다.

이 접근 방식은 동기화되고 안정적인 채널 닫기를 보장하여 원본 코드에서 발생하는 문제를 방지합니다. 또한 잠자기 통화 및 바쁜 대기가 필요하지 않아 보다 효율적이고 강력한 솔루션을 제공합니다.

위 내용은 WaitGroup을 사용하여 모든 고루틴이 완료된 후 어떻게 채널을 안전하게 닫을 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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