Go 동시성에서 고루틴 교착 상태 해결
동시 Go 프로그램에서 고루틴이 서로 리소스를 해제할 때까지 무기한 기다릴 때 교착 상태가 발생할 수 있습니다. 이러한 교착 상태를 해결하려면 다음 예를 고려하십시오.
<code class="go">// Create a channel for communication between goroutines. ch := make(chan int) // Start producer goroutines that send values to the channel. go producer(ch, 100*time.Millisecond, 2) go producer(ch, 200*time.Millisecond, 5) // Indefinite loop to continuously receive values from the channel. for { fmt.Println(<-ch) }</code>
이 코드는 교착 상태 오류를 발생시킵니다: "치명적인 오류: 모든 고루틴이 잠자기 상태입니다 - 교착 상태!" 이는 생산자의 수명이 유한하여 결국 전송이 중단되는 반면 소비자 고루틴은 끝없이 새로운 값을 기다리기 때문에 발생합니다. 이러한 교착 상태를 피하기 위해 두 가지 주요 전략을 사용할 수 있습니다:
1. 채널 종료:
채널은 한 번만 닫힐 수 있으므로 제작자가 소비자에게 종료 신호를 보내는 것이 중요합니다. 코디네이터는 프로듀서의 완성도를 모니터링하고 이에 따라 채널을 폐쇄할 수 있습니다.
2. 조정된 동기화:
sync.WaitGroup과 같은 동기화 프리미티브를 사용하여 프로듀서는 작업이 완료되면 코디네이터에게 알릴 수 있고 코디네이터는 모든 프로듀서가 완료되면 채널을 닫을 수 있습니다.
동기화를 사용하여 업데이트된 코드:
<code class="go">import ( "fmt" "sync" "time" ) func producer(ch chan int, d time.Duration, num int, wg *sync.WaitGroup) { defer wg.Done() for i := 0; i < num; i++ { ch <- i time.Sleep(d) } } func main() { // Create a WaitGroup for coordinating producer completion. wg := &sync.WaitGroup{} // Initialize the channel for communication between goroutines. ch := make(chan int) // Start producer goroutines. wg.Add(2) go producer(ch, 100*time.Millisecond, 2, wg) go producer(ch, 200*time.Millisecond, 5, wg) // Assign a goroutine to close the channel when all producers have finished. go func() { wg.Wait() close(ch) }() // Iterate over values from the channel until it's closed. for v := range ch { fmt.Println(v) } }</code>
결론:
채널 종료 또는 조정된 동기화를 구현함으로써 개발자는 고루틴 교착 상태를 효과적으로 방지할 수 있으며 동시 Go 프로그램의 적절한 조정을 보장합니다.
위 내용은 ## 동시 Go 프로그램에서 교착 상태를 피하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!