채널을 무한정 채우는 고루틴을 생성하는 함수가 있습니다. 예를 들면 다음과 같습니다.
으아악일정 시간이 지난 후 중지하고 싶은 소비자가 있다고 가정해 보겠습니다.
으아악이제 채널을 포함한 고루틴 리소스를 정리하고 싶습니다. 이에 대해 "완료" 채널을 추가하려고 시도했지만 교착 상태에 빠졌습니다.
으아악이제 작동하는 것 같지만 일부 io 작업으로 대체하면 프로그램이 종료되기 때문입니다 // here
(例如:http.get(“http://google.com”)
) ,我面临死锁(fatal 错误:所有 goroutine 都在睡觉 - 死锁!
).
foo
함수로 생성된 고루틴과 채널을 정리하는 다른 방법이 있는지 궁금합니다. foo
函数创建的生成的 goroutine 和通道。
只需在启动的 goroutine 中将 default
替换为 case
default
시작 고루틴에서
case
로 바꾸세요: done
通道时,启动的写入 ch
通道的 goroutines 会立即转到 default
情况。然后 goroutine 会阻塞在 ch <- 1
行,直到其他 goroutine 从 ch
상황에서 원본 코드가 교착 상태에 빠진 이유는 다음과 같습니다. ch
读取两次。这会导致在启动的 goroutine 处有两个成功的执行循环。然后它尝试写入 done
。此时启动的goroutine可能已经检查了select
语句,陷入default
情况并阻塞在ch <- 1
行。因此主 goroutine 也会无限期地阻塞在 done <- true
ch
채널에 쓰기를 시작한 고루틴은 동시에 실행 중인 다른 고루틴이 done
채널에 쓰지 않는 경우 즉시 ch
에서 값을 읽을 때까지 ch 줄을 차단합니다.
ch
에서 두 번 읽습니다. 이로 인해 시작된 고루틴에서 두 개의 성공적인 실행 루프가 발생합니다. 그런 다음 done
쓰기를 시도합니다. 이때 시작된 고루틴은 select
문을 확인하여 🎜 상황에 빠져 ch 줄에서 차단되었을 수 있습니다. 따라서 기본 고루틴도 done <- true
줄에서 무기한 차단됩니다. 이로 인해 교착 상태가 발생할 수 있습니다. 🎜
🎜
위 내용은 채널에 무기한으로 쓰는 고루틴을 중지합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!