채널에 객체를 추가하려면 go-routine
을 가지고 있습니다. 그런 다음 채널 객체를 처리하기 위해 go-routines
을 가지고 있습니다. 처리는 배열에 객체를 추가하는 것입니다. 그러나 몇 번에, 최종 배열에서 객체가 누락됩니다. 그래서 나는 어떤 시점에서 물체를 수집하기 위해 채널이 멈추는 것으로 가정하고 있습니다. 내가 루틴을 동기화 할 sync
라이브러리를 사용하고채널에서 모든 객체를 수집하지 않는 루틴을 실행하십시오
package main
import (
"log"
"sync"
)
func main() {
j := 0
for {
if j == 10 {
break
}
wg := sync.WaitGroup{}
months := []string{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul"}
hits := make(chan string)
i := 0
wg.Add(1)
go func() {
defer close(hits)
for {
if i == 25 {
wg.Done()
return
}
for _, month := range months {
hits <- month
}
i++
}
}()
temp := []string{}
for updateWorker := 1; updateWorker <= 4; updateWorker++ {
wg.Add(1)
go func() {
for hit := range hits {
temp = append(temp, hit)
}
wg.Done()
return
}()
}
wg.Wait()
log.Printf("length of temp %+v\n", len(temp))
j++
}
}
: 나는 다음과 같은 코드가 있습니다. 출력이 일관되는지 테스트하기 위해 동일한 프로세스를 10 번 반복합니다. 다음과 같은 출력을 기대합니다 :
length of temp 175
7 개월 문자열을 25 회 보내므로 175입니다. 하지만 출력이 175 미만인 이유는 무엇인지 모릅니다. 나는 일과 관련하여 초보자 다. 아무도 여기 이유를 찾는데 도와 주실 수 있습니까? 감사.