고루틴은 동시 프로그래밍을 위한 Go의 기본 개념입니다. 이를 통해 메인 스레드를 차단하지 않고 여러 작업을 동시에 실행할 수 있습니다. 그러나 고루틴을 사용하는 것은 까다로울 수 있으며, 특히 여러 고루틴에서 결과를 수집할 때 더욱 그렇습니다.
문제 설명
한 개발자가 고루틴을 사용하여 다음 목록을 처리하려고 했습니다. 항목을 선택하고 처리된 값을 조각으로 수집합니다. 그러나 그들은 "모든 고루틴이 잠들어 있습니다. 교착 상태입니다!"라는 두려운 상황에 직면했습니다. error.
교착상태의 근본 원인
코드가 결과 수집을 시도하기 전에 모든 고루틴의 처리가 완료되기를 기다리고 있었기 때문에 교착상태가 발생했습니다. 이로 인해 고루틴은 슬라이스에 쓸 수 있을 때까지 기다리는 반면, 메인 스레드는 고루틴의 처리가 완료되기를 기다리는 상황이 발생했습니다.
해결책
교착 상태를 해결하려면 고루틴과 메인 스레드 간의 통신에 사용되는 채널의 비동기식 폐쇄를 도입해야 합니다. 아래 수정된 코드는 해결 방법을 보여줍니다.
// ... // Create a channel to receive the processed values sampleChan := make(chan sample) var wg sync.WaitGroup // Process each item in the list with a goroutine for i, line := range contents { wg.Add(1) go func(line string) { defer wg.Done() // Process the item and send the result on the channel sampleChan <- newSample(line, *replicatePtr, *timePtr) }(line) } // Asyncronously close the channel when all goroutines are done go func() { wg.Wait() close(sampleChan) }() // Read from the channel and gather results into a slice var sampleList []sample for s := range sampleChan { sampleList = append(sampleList, s) } // ...
채널을 비동기적으로 닫으면 고루틴이 처리되는 동안에도 메인 스레드가 결과 수집을 진행할 수 있습니다. 이렇게 하면 교착 상태가 해제되고 코드가 올바르게 실행될 수 있습니다.
추가 고려 사항
이 솔루션이 교착 상태를 해결하기는 하지만 완전한 솔루션은 아니라는 점은 주목할 가치가 있습니다. 이 특정 시나리오에서 동시성을 관리하는 데 사용됩니다. 요구 사항과 고루틴 수에 따라 코드의 신뢰성과 정확성을 보장하기 위해 추가 동기화 및 오류 처리 메커니즘이 필요할 수 있습니다.
위 내용은 Go에서 고루틴 결과를 수집할 때 교착 상태를 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!