私は1つのgo-routine
をチャネルにオブジェクトを追加するために持っていますし、チャネルのオブジェクトを処理するために4 go-routines
があります。処理は、配列にオブジェクトを追加するだけです。しかし、数回では、オブジェクトは最終的な配列から欠落しています。だから私は、ある時点でオブジェクトを収集するためにチャネルが停止していると仮定しています。私は次のコードを持っています:チャンネルからすべてのオブジェクトを収集していないルーチンを返します
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++
}
}
私はsync
ライブラリを使ってルーチンを同期させています。出力が一貫しているかどうかをテストするために同じプロセスを10回繰り返します。
length of temp 175
私は7桁の文字列を25回送信しているため、175です。 しかし、出力が175未満の場合は、理由がわかりません。私はルーチンに行くのは初心者です。だから誰でも私に理由を見つけるのを助けてくれますか?ありがとう。