>  기사  >  백엔드 개발  >  모든 고루틴이 잠자기 상태입니다 - 교착 상태, 버퍼링된 채널에서 이유를 알 수 없습니다.

모든 고루틴이 잠자기 상태입니다 - 교착 상태, 버퍼링된 채널에서 이유를 알 수 없습니다.

王林
王林앞으로
2024-02-08 20:50:13918검색

所有 goroutine 都在睡觉 - 死锁,在缓冲通道上,不明白为什么

질문 내용

5개 정도의 특정 수의 바둑 루틴만 만들고 싶지만 다양한 수의 작업을 받을 수 있습니다.

아래 테스트를 통해 이 작업을 수행하려는 코드는 다음과 같습니다.

으아악

이것에 대한 테스트

으아악

테스트 jobs 10 容量 5 有效,但 jobs 100 容量 5에 실패했습니다.

100개의 작업에 대해 용량을 50으로 설정하면 작동하지만 30개의 작업에는 작동하지 않으며 해당 동작을 이해할 수 없습니다.

다음은 채널에 대한 저의 이해와 효과가 있을 것으로 예상하는 내용입니다.

버퍼 채널이 꽉 차면 여유 용량을 사용할 수 있을 때까지 차단됩니다. 일단 작업 채널이 꽉 차면 chanworker가 그 중 일부를 해제할 때까지 차단될 것으로 예상합니다. chanworker 자체는 용량을 받고 빈 구조를 사용하여 5개 이하의 작업자 스레드가 생성되도록 합니다.

왜 오류가 발생하나요? 치명적인 오류: 모든 고루틴이 잠자기 상태입니다. 교착 상태입니다! ? 致命错误:所有 goroutine 都在休眠 - 死锁!


正确答案


由于主 goroutine 在所有作业都发送到 jobs 之前不会从 results 接收值,因此工作线程会在发送到 results 时阻塞。主 goroutine 阻止发送到 jobs

정답

모든 작업이 jobs로 전송될 때까지 메인 고루틴은 results에서 값을 받지 않으므로 >, 따라서 결과로 보내는 동안 작업자 스레드가 차단됩니다. 작업이 차단되었기 때문에 기본 고루틴은 작업으로의 전송을 차단합니다. 이중 자물쇠!

고루틴을 사용하여 작업을 수행하여 문제가 해결되었습니다. 으아악

🎜https://www.php.cn/link/6e04df31f1bbb1c02666d0dfa3638f76🎜🎜

위 내용은 모든 고루틴이 잠자기 상태입니다 - 교착 상태, 버퍼링된 채널에서 이유를 알 수 없습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제