> 백엔드 개발 > Golang > 버퍼링된 채널을 세마포로 사용할 때 프로그램 종료 전에 모든 고루틴이 완료되었는지 확인하는 방법은 무엇입니까?

버퍼링된 채널을 세마포로 사용할 때 프로그램 종료 전에 모든 고루틴이 완료되었는지 확인하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-30 10:09:11
원래의
498명이 탐색했습니다.

How to Ensure All Goroutines Complete Before Program Exit When Using a Buffered Channel as a Semaphore?

버퍼 채널이 드레이닝되기를 기다리는 중

제공된 코드에서는 버퍼 채널을 세마포어로 사용하여 동시 채널 수를 제한합니다. 고루틴을 실행 중입니다. 그러나 채널이 배수될 때까지 기다리는 명시적인 메커니즘이 없으면 모든 고루틴 실행이 완료되기 전에 기본 프로그램이 종료될 수 있습니다.

문제:

이를 보장하는 방법 프로그램은 모든 고루틴이 완료될 때까지 기다립니다. 종료하시겠습니까?

답변:

이 목적으로 세마포어(채널)를 사용하는 것은 채널의 길이를 확인하고 기다리는 방법이 내장되어 있지 않기 때문에 이상적이지 않습니다. 0에 도달합니다. 고루틴이 완료될 때까지 제대로 기다리려면 다음과 같은 동기화 프리미티브를 사용하는 것을 고려하세요. sync.WaitGroup.

업데이트된 코드:

sem := make(chan struct{}, 2)
var wg sync.WaitGroup

for _, i := range ints {
    wg.Add(1)
    // acquire semaphore
    sem <- struct{}{}
    // start long running go routine
    go func(id int) {
        defer wg.Done()
        // do something
        // release semaphore
        <-sem
    }(i)
}

wg.Wait()
로그인 후 복사

sync.WaitGroup은 미해결 작업 수를 유지합니다(이 경우 고루틴). . 이렇게 하면 기본 프로그램이 모든 작업이 완료될 때까지 기다릴 수 있습니다. wg.Add(1)는 새 ​​고루틴을 시작하기 전에 작업 수를 증가시키고, wg.Done()은 고루틴이 완료되면 작업 수를 감소시킵니다. wg.Wait() 호출은 작업 수가 0에 도달할 때까지 기본 프로그램을 차단하여 프로그램이 종료되기 전에 모든 고루틴이 완료되도록 합니다.

위 내용은 버퍼링된 채널을 세마포로 사용할 때 프로그램 종료 전에 모든 고루틴이 완료되었는지 확인하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿