Go에서 고루틴을 활용하여 항목을 병렬로 처리하고 결과를 수집하는 것이 목표입니다. 조각으로. 그러나 다음과 같은 당황스러운 교착 상태 오류가 발생했습니다. "모든 고루틴이 잠자기 상태입니다 - 교착 상태입니다!"
오류는 코드의 두 가지 문제로 인해 발생합니다.
이러한 문제를 해결하려면 작업자가 완료될 때 채널을 비동기적으로 닫는 goroutine을 도입하세요.
for i, line := range contents { wg.Add(1) go newSample(line, *replicatePtr, *timePtr, sampleChan, &wg) } go func() { wg.Wait() close(sampleChan) }() for s := range sampleChan { .. }
최적의 효율성을 위해 고정된 수의 작업자가 필요하면 다음과 같이 코드를 리팩터링합니다.
for i, line := range contents { wg.Add(1) go func(line string) { defer wg.Done() sampleChan <- newSample(line, *replicatePtr, *timePtr) }(line) }
이렇게 하면 동시성 기본 요소가 함께 유지되고 다양한 동시성 패턴에 대한 리팩토링이 단순화됩니다.
위 내용은 병렬 처리 및 결과 수집을 위해 고루틴을 사용할 때 교착 상태를 피하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!