Go 루틴 차단 기타: 더 깊은 설명
Go에서 다음 코드는 무한 루프가 있는 고루틴처럼 보이는 비정상적인 동작을 보여줍니다. 다른 고루틴의 메시지가 의도한 채널에 도달하는 것을 방지합니다:
func main() { timeout := make(chan int) go func() { time.Sleep(time.Second) timeout <- 1 }() res := make(chan int) go func() { for { } res <- 1 }() select { case <-timeout: fmt.Println("timeout") case <-res: fmt.Println("res") } }
대신 1초 후에 종료되면 프로그램은 무한 루프에 들어갑니다. 왜 이런 일이 발생합니까?
Go의 협력 스케줄링 이해
답은 Go가 고루틴에 협력 스케줄링을 사용하는 데 있습니다. 고루틴은 다음을 포함한 특정 조건에서 스케줄러에 제어권을 양보합니다.
첫 번째 고루틴의 무한 루프는 결코 양보하지 않으므로 다른 고루틴이 실행되고 채널에 메시지를 보내는 것을 방지합니다. 여기에는 결코 도착하지 않는 메시지를 기다리는 타임아웃 채널이 포함됩니다.
잠재적 솔루션
협조적인 일정으로 인해 이러한 상황이 발생할 수 있지만 잠재적인 솔루션이 있습니다. :
위 내용은 Infinite Go 루틴이 다른 고루틴이 채널로 전송하는 것을 차단하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!