Go読書会 #16 がランサーズ株式会社で行われたので進捗と技術的なメモ書きを書いておきます。読書会の内容はプログラミング言語Goを冒頭から皆で読み進めていくというものです。
進捗した内容
- 8章 ゴルーチンとチャンネル
- 8.4 チャネル
- 8.4.3 バッファ有りチャネル
- 8.5 並列にループする
- 8.6 例:並行Webクローラ
- 8.7 selectでの多重化
- 8.8 例:平行なディレクトリ走査
- 8.4 チャネル
話題に上がった話
8.4.3 バッファ有りチャネル
ここでは、要素のキューを指定できるバッファ有りチャンネルについて解説されていました。
// 最後の引数に1以上の数値を入れる
ch := make(chan string, 3)
処理される順序はFIFO(First In First Out)になっていて、入れた順序で処理されます。チャンネルが一杯のケースだと送信側が空きができるまでブロック
され、チャンネルが空きの場合は受信操作はが別のゴルーチンが値を送信するまでブロック
されるということろが話題になりました。
あとは、ゴルーチンのリーク(goroutine leak)
という、回収されないゴルーチンが発生する状況があり得るのでそこいに注意が必要と言うことも書かれていました。
8.5 並列にループする
ここでは、気恥ずかしいほどに並列的(embarrassingly parallel)
と呼ばれる問題がでてきました。これは簡単に並列を実行できて線形にスケールする問題のことを指していました。ここでも、実装の仕方によってはゴルーチンのリークが起きるので十分な大きさをもつバッファ有りチャネルを使用することが推奨されていました。
8.6 例:並行Webクローラ
ここでは、制限のない並列性によって、コンピュータの資源を使い尽くしてしまう可能性があることに触れていました。解決策としてバッファ有りチャネルを使用で、計数セマフォ(counting semaphore)
を操作して一度に起動するゴルーチンを制限する方法が書かれていました。
8.7 selectでの多重化
ここでは、select文
を使用した操作の多重化がでてきました。
select {
case -> cha1:
case x := <-ch2:
}
selectはどれかのcaseで処理の準備ができるまで待ち、準備が完了した通信を行います。こちらのI/O多重化用selectからこの名前がきてるじゃないかなという話が話題になりました。
ここまで呼んだところで、時間になりました。次回は 8.9 チャネルからです。