길이를 알 수 없는 채널 닫기
제공된 코드에서는 여러 고루틴이 전송을 시도하기 때문에 "폐쇄된 채널에서 전송" 오류가 발생합니다. 이미 폐쇄된 채널의 가치. 이 문제는 하나의 고루틴이 채널을 닫고 다른 고루틴은 여전히 데이터를 전송하고 있기 때문에 고루틴 간의 동기화 부족으로 인해 발생합니다.
이 상황에서 채널을 효과적으로 닫으려면 모든 발신자 고루틴이 언제 채널을 닫는지 확인하는 것이 중요합니다. 그들의 임무를 완료했습니다. 이는 모든 발신자 고루틴이 값 전송을 완료한 시점을 감지하기 위해 sync.WaitGroup을 사용하여 달성할 수 있습니다.
다음은 sync.WaitGroup을 사용하는 수정된 코드입니다.
func gen(ch chan int, wg *sync.WaitGroup) { defer wg.Done() var i int for { time.Sleep(time.Millisecond * 10) ch <- i i++ // when no more data (e.g. from db, or event stream) if i > 100 { break } } } func receiver(ch chan int) { for i := range ch { fmt.Println("received:", i) } } func main() { ch := make(chan int) wg := &sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) go gen(ch, wg) } go func() { wg.Wait() close(ch) }() receiver(ch) }
이 솔루션에서, 각 발신자 고루틴은 sync.WaitGroup에 하나를 추가하여 채널에서 값을 보낼 것임을 나타냅니다. close() 고루틴의 wg.Wait()는 모든 송신자 고루틴이 작업을 완료한 후에만 채널이 닫히도록 보장하여 "닫힌 채널에서 보내기" 오류를 방지합니다.
위 내용은 Go에서 길이를 알 수 없는 채널을 안전하게 닫는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!