Go에서 Go 루틴 차단
Go에서는 하나의 go 루틴이 다른 루틴의 실행을 차단할 때 일반적인 문제가 발생합니다. 이 질문은 무한 루프가 있는 go 루틴이 다른 루틴이 타임아웃 채널로 데이터를 보내는 것을 막을 수 있는 이유를 탐구합니다.
문제는 Go에서 협력 스케줄링을 사용하는 데 있습니다. 이 시스템에서 고루틴은 다른 루틴이 실행될 수 있도록 스케줄러에 실행을 다시 넘겨주어야 합니다. 다음을 포함하여 고루틴이 양보하는 여러 가지 상황이 있습니다.
주어진 코드에서 무한 루프가 있는 go 루틴은 양보하지 않고 지속적으로 실행되므로 다른 루틴이 실패하는 것을 방지합니다. 타임아웃 채널에 쓰기. 이 무한 루프는 전체 프로그램을 효과적으로 차단합니다.
이 문제에 대한 해결책은 선점형 스케줄링을 사용하여 고루틴이 주기적으로 양보하도록 하는 것입니다. 그러나 Go는 현재 협력적 스케줄링을 사용합니다.
한 가지 가능한 해결 방법은 GOMAXPROCS를 통해 프로세서 수를 늘리는 것입니다. 이를 통해 여러 고루틴을 동시에 실행할 수 있지만, CPU 바인딩 루틴이 양보하지 않는 경우 가비지 수집기가 여전히 세계를 중지하고 모든 고루틴을 중지할 수 있다는 점에 유의하는 것이 중요합니다.
위 내용은 One Go 루틴의 무한 루프가 다른 사람이 시간 초과 채널로 데이터를 보내는 것을 차단하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!