Go言語の並行処理に関する公式ドキュメント

背景

goroutineなんもわからん。書くことができても使いこなすことができてるとは言い難いなあと日々感じている。Goは並行処理の理解の助けのため、リポジトリwikiにたくさんの資料がある。

資料を全部読んだ上で解説したいものだが、一部しか読めていない。今回はwikiにある資料を眺めてその傾向がわかったので、Goの並行処理関連資料のガイドラインとして活用していきたい。

wiki

資料がレベルで分かれているため、各レベルがどの程度の内容を扱っているのか確認しようと思う。

LearnConcurrency · golang/go Wiki · GitHub

Beginner

ざっと眺めたところ公式ドキュメント詰め合わせパックって感じだった。普段Goを書いている人でもこれらの資料を全部理解している人は少なそう。きちんと読めば他のGopherと比べて頭一つ抜けそうな気がした。

言語仕様からGoの並行性へのコンセプト、あとはgoroutineが何であるか、という話が多い。Beginnerレベルの資料を読み込めばgroutineの輪郭が掴めるだろうと思う。

Do not communicate by sharing memory; instead, share memory by communicating.

これを言えるとカッコいい。ここぞというタイミングで詠唱しよう。

Intermediate

goroutineでの実装パターンが多い印象。下記に記載されていたポストをいくつか載せておく。

これらの実装パターンを読めば並行処理の引き出しが増えそう。また、他人の書いた並行処理に関して良い悪いの分別もつけられるようになりそう。

さらに、並行処理を使った際に必ず付き合うことになる競合のサポートツールであるrace-detectorの資料もあった。

Introducing the Go Race Detector - The Go Blog

かなり実践的。このレベルを押さえると普段の業務で並行処理の実装で困ることはほとんどなさそう。

Advanced

メモリモデルやスケジューラ、チャンネルについて、それぞれどのようなメカニズムなのか解説している。

ここまでいくとメモリ上でGoの並行性がどのように動いているか理解できる。ただ資料を読めていないので何も言うことがない。内容は難しそうだけど面白そうなので時間を作って読みたい。

Additional Go Programming Wikis

wikiに「mutexかchannelか」というページがある。この話題はよく行われるし実装時にも意識すべきことなのでしっかりと理解したい。

下記に引用するが、楽しいからってchannelやgoroutineを多用するな、という点は本質的だと思う。

A common Go newbie mistake is to over-use channels and goroutines just because it's possible, and/or because it's fun.

そして、どちらを使うのかの判断基準はsimpleさである、という点も常に頭に入れておきたい。

Use whichever is most expressive and/or most simple.

MutexOrChannel · golang/go Wiki · GitHub

まとめ

wikiにある各レベルを整理するとこんな感じだろうか。

  • Beginner:Goの並行性は何なのか
  • Intermediate:Goの並行性をどのように使うか
  • Advanced:Goの並行性はどのように動くか

Goの並行処理について何か知りたいことが生まれた場合、上記に照らし合わせてwikiに貼ってあるリンクを読んでいくと良いのかなと思った。

雑談

タイミング的に2021年からになってしまったけれど、これからは目に見えるアウトプットをしっかりと残していきたいなと思ってブログの投稿を再開した。
ただ、普段から書いていたわけじゃないので生産体制が整わない中、Notionを使って投稿タイトルと簡単な骨子、公開スケジュールなどを組んでいくと自然と逆算して資料読んだり検証できるようになった。Notionは偉大。