> 백엔드 개발 > Golang > My Go가 동기화되지 않는 이유는 무엇입니까?WaitGroup이 완료되지 않습니까?

My Go가 동기화되지 않는 이유는 무엇입니까?WaitGroup이 완료되지 않습니까?

Barbara Streisand
풀어 주다: 2024-11-27 04:57:14
원래의
303명이 탐색했습니다.

Why Doesn't My Go sync.WaitGroup Ever Complete?

Golang sync.WaitGroup Never Completes

제공된 코드는 URL 목록을 가져오고 조건부로 파일을 다운로드하고 파일에 저장하여 동시성을 보여줍니다. 체계. 기본 고루틴은 sync.WaitGroup을 사용하여 모든 파일을 가져올 때까지 기다립니다. 그러나 모든 요청을 완료한 후에도 프로그램이 종료되지 않습니다.

문제를 이해하려면 WaitGroup의 기능을 고려하십시오. 실행 중인 고루틴의 수를 유지합니다. 개수가 0에 도달하면 대기 그룹은 즉시 반환되어 모든 고루틴의 실행이 완료되었음을 나타냅니다.

주어진 코드에서 WaitGroup의 Add 메서드는 개수를 늘리는 데 사용되는 반면 Done 메서드는 개수를 줄이는 데 사용됩니다. . Add 메서드가 Done 메서드보다 더 많이 호출되거나 그 반대의 경우에는 WaitGroup이 0에 도달하지 않아 기본 고루틴이 무기한 대기하게 됩니다.

제공된 코드에는 두 가지 오류가 있습니다.

  1. downloadFromURL 함수는 WaitGroup에 대한 포인터가 아닌 복사본을 받습니다. 이로 인해 WaitGroup의 내부 데이터 복사본이 전달되므로 함수 내에서 수정된 내용(예: Done 호출)이 기본 고루틴에 표시되지 않습니다. 이 문제를 해결하려면 대신 WaitGroup에 포인터를 전달하십시오.
func main() {
    ...
    go downloadFromURL(url, &wg)
    ...
}
로그인 후 복사
  1. defer wg.Done() 문은 downloadFromURL 함수의 첫 번째 문으로 배치되지 않습니다. Done을 ​​호출하기 전에 오류가 발생하거나 다른 논리가 실행되면 감소 작업이 등록되지 않으며 WaitGroup의 개수는 결코 0에 도달하지 않습니다. 이 문제를 해결하려면 defer wg.Done()이 함수의 첫 번째 문인지 확인하세요.
func downloadFromURL(url string, wg *sync.WaitGroup) error {
    defer wg.Done()
    ...
}
로그인 후 복사

이러한 수정 사항을 적용하면 WaitGroup이 올바르게 작동하고 고루틴이 작업을 완료할 때 개수가 감소합니다. 궁극적으로 메인 고루틴의 성공적인 종료로 이어집니다.

위 내용은 My Go가 동기화되지 않는 이유는 무엇입니까?WaitGroup이 완료되지 않습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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