私は go のチャネルと goroutines についてもっと理解しようとしているので、bufio.NewScanner
オブジェクトによって読み取られるファイルから単語をカウントする小さなプログラムを作成することにしました。
nCPUs := flag.Int("cpu", 2, "number of CPUs to use")
flag.Parse()
runtime.GOMAXPROCS(*nCPUs)
scanner := bufio.NewScanner(file)
lines := make(chan string)
results := make(chan int)
for i := 0; i < *nCPUs; i++ {
go func() {
for line := range lines {
fmt.Printf("%s\n", line)
results <- len(strings.Split(line, " "))
}
}()
}
for scanner.Scan(){
lines <- scanner.Text()
}
close(lines)
acc := 0
for i := range results {
acc += i
}
fmt.Printf("%d\n", acc)
さて、これまでに見つけたほとんどの例では、lines
とresults
チャネルの両方がmake(chan int, NUMBER_OF_LINES_IN_FILE)
. それでも、このコードを実行した後、私のプログラムは存在し、fatal error: all goroutines are asleep - deadlock!
エラー メッセージが表示されます。
make(chan)
基本的に私の考えでは、2 つのチャネルが必要であると考えています。1 つは、ファイルからの行を goroutine に伝達するためです (任意のサイズにすることができるため、関数呼び出しでサイズを通知する必要があるとは考えたくありません。他のチャネルはゴルーチンから結果を収集し、メイン関数でそれを使用して累積結果を計算します。
ゴルーチンとチャネルを使用してこの方法でプログラミングするための最良のオプションは何ですか? どんな助けでも大歓迎です。