Go의 교착 상태: "모든 go 루틴이 잠자기 상태입니다."
제공된 코드 실행 시 비동기 실행 모델로 인해 교착 상태가 발생함 고루틴을 사용합니다. 트럭이 채널로 전송되기 전에 UnloadTrucks 함수가 호출되면 문제가 발생합니다. 이로 인해 채널이 비어 있게 되어 송신자 고루틴이 ch <- tr 행에서 차단됩니다. 송신자 고루틴이 트럭 보내기를 기다리고 있기 때문에 채널을 닫을 수 없으며, 트럭 수신을 기다리는 UnloadTrucks 기능이 무기한 멈춥니다.
해결책: WaitGroup을 사용하여 채널 닫기
교착 상태를 해결하려면 모든 고루틴이 트럭 전송을 마친 후 채널 ch를 닫을 수 있습니다. 이는 대기 중인 고루틴 수를 추적하는 동기화 프리미티브인 WaitGroup을 도입하여 달성할 수 있습니다.
이 고루틴은 다른 모든 고루틴이 해당 작업을 완료할 때까지 기다립니다(Wait() 호출에 의해 신호됨). 채널을 닫습니다. 이렇게 하면 모든 트럭이 전송된 후 UnloadTrucks 기능이 정상적으로 종료될 수 있습니다.
수정된 코드:
이 수정된 코드를 사용하면 교착 상태가 발생합니다. UnloadTrucks 기능은 채널이 닫히기 전에 모든 트럭을 수신하도록 보장되기 때문에 제거됩니다. 이렇게 하면 모든 고루틴이 작업을 올바르게 완료하고 프로그램이 예상치 못한 중단 없이 실행될 수 있습니다.
위 내용은 비동기 작업 및 빈 채널로 인해 발생하는 Go 교착 상태를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!