April 2022
Beginner to intermediate
464 pages
6h 44m
Japanese
チャネルを使って初めてGoで並行処理を実装するとき、最初につまずくのが延々と待ち続けてしまう状態です。
スレッドプールを作って並行でタスクをさせるときに、結果をチャネルで受け取るとします。このとき、タスクが完了したかどうかがわからず、結果を受け取るチャネルが待ち続けてしまう、というような失敗をしてしまいます。タスクの数を数えて、完了するまでおそるおそるチャネルから読み込むといった処理を実装したことはないでしょうか? ブロックを避けるあまり、多めにバッファを指定したチャネルを作ってしまったこともあるでしょう。
Goのチャネルをそのまま使うと、基本的には通信完了まで待ち続けることには変わりないのですが、これを補助するselectがあります。selectを使うと、複数チャネルの送受信を同時に待ち受けたり、どのチャネルにもアクセスがなかった場合に処理を抜けられたりします。
select {
case <-recv:
log.Println("受信があったこと or チャネルのクローズを感知 (どちらか判断はできない、値は捨てる)")
case v := <-recv2:
log.Println("受信があったこと or チャネルのクローズを感知 (どちらか判断はできない、値は受け取る):", v)
case v, ok := <-recv3:
log.Println("受信があったこと or チャネルのクローズを感知 (チャネルの状態と値は受け取る):", v, ok)
case send <- 10:
log.Println("送信が成功したことを検知" ...Read now
Unlock full access