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 중국어 웹사이트의 기타 관련 기사를 참조하세요!