다른 고루틴을 차단하는 고루틴
주어진 코드 조각에서 첫 번째 고루틴은 무한 루프에 들어가 나머지 고루틴이 다음으로 전송되는 것을 차단합니다. 타임아웃 채널. 이 동작은 고루틴 협력 스케줄링의 특징입니다.
고루틴은 다음 시나리오에서 스케줄러에 양보합니다.
이 경우 첫 번째 고루틴의 무한 루프는 할당을 방지합니다. 스케줄러. 따라서 다른 고루틴은 타임아웃 채널로 보낼 수 없으며 프로그램은 1초 후에 종료되지 않고 무한정 계속 실행됩니다.
이 문제에 대한 한 가지 잠재적인 해결책은 협력 스케줄러 대신 선점형 스케줄러를 사용하는 것입니다. 선점형 스케줄러에서 시스템은 우선순위에 따라 고루틴을 강제로 전환합니다. 그러나 Go는 현재 협력 스케줄러를 사용합니다.
또 다른 전략은 Runtime.Gosched()를 사용하여 스케줄러에 수동으로 양보하는 것입니다. 그러나 채널이나 시스템 I/O를 통한 충분한 통신으로 인해 일반적으로 이 기술은 대부분의 프로그램에 필요하지 않습니다.
GOMAXPROCS를 더 높은 값으로 설정해도 문제가 완전히 해결되지 않을 수 있다는 점에 유의하는 것이 중요합니다. 여러 고루틴을 병렬로 실행할 수 있지만 가비지 수집기는 여전히 동기 방식으로 작동합니다. 높은 CPU 고루틴이 결코 양보하지 않으면 GC는 실행 중에 다른 고루틴을 무기한 차단할 수 있습니다.
위 내용은 고루틴이 서로를 차단하는 이유는 무엇이며, 이 문제를 어떻게 해결할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!