> 백엔드 개발 > Golang > 채널에 무기한으로 쓰는 고루틴을 중지합니다.

채널에 무기한으로 쓰는 고루틴을 중지합니다.

WBOY
풀어 주다: 2024-02-05 23:09:07
앞으로
946명이 탐색했습니다.

停止无限期写入通道的 goroutine

질문 내용

채널을 무한정 채우는 고루틴을 생성하는 함수가 있습니다. 예를 들면 다음과 같습니다.

으아악

일정 시간이 지난 후 중지하고 싶은 소비자가 있다고 가정해 보겠습니다.

으아악

이제 채널을 포함한 고루틴 리소스를 정리하고 싶습니다. 이에 대해 "완료" 채널을 추가하려고 시도했지만 교착 상태에 빠졌습니다.

으아악

이제 작동하는 것 같지만 일부 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 <- truech 채널에 쓰기를 시작한 고루틴은 동시에 실행 중인 다른 고루틴이 done 채널에 쓰지 않는 경우 즉시
  • 사례로 이동합니다. 그런 다음 고루틴은 다른 고루틴이 ch에서 값을 읽을 때까지 ch 줄을 차단합니다.
🎜메인 코루틴은 ch에서 두 번 읽습니다. 이로 인해 시작된 고루틴에서 두 개의 성공적인 실행 루프가 발생합니다. 그런 다음 done 쓰기를 시도합니다. 이때 시작된 고루틴은 select 문을 확인하여 🎜 상황에 빠져 ch 줄에서 차단되었을 수 있습니다. 따라서 기본 고루틴도 done <- true 줄에서 무기한 차단됩니다. 이로 인해 교착 상태가 발생할 수 있습니다. 🎜 🎜

위 내용은 채널에 무기한으로 쓰는 고루틴을 중지합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿