4章Goでの並行処理パターン
Goの並行処理に関するプリミティブの基礎を紹介し、それらを正しく使う方法について議論してきました。この章では、これらのプリミティブの組み合わせ、システムをスケーラブルで保守可能に保つパターンにする方法について深く掘り下げていきます。
しかしながら、その前にこの章で紹介するいくつかのパターンの形式について触れておく必要があります。多くの例で、空インターフェース型(interface{}
)を引き回しているチャネルを使っています。Goで空インターフェース型を使うことに関しては議論の余地があります。しかしながら、ここで空のインターフェース型を用いているのにはいくつかの理由があります。1つめは残りのページ数で簡潔に例を書くためです。2つめはある状況においてパターンが何を実現しようとしているかがわかりやすくなるからです。2つめに関しては4.6 パイプラインの節でより直接的にお話します。
反論したいことがたくさんあるかもしれませんが、Goのジェネレーターを使っていつでもこうしたコードを生成することができますし、必要な型を使ったパターンを生成できます†1。
[†1] 訳註:go generate
のことです。go generate
について、詳しくは補遺Bを参照してください。
そういうわけで、早速Goでの並行処理のパターンをいくつか学んでいきましょう!
4.1 拘束
並行なコードを扱うときに、安全な操作をするためにはいくつかの異なる方法が考えられます。これまでにそのうちの2つについて見てきました。
- メモリを共有するための同期のプリミティブ(例:
sync.Mutex
) - 通信による同期(例: チャネル)
しかしながら、複数の並行プロセス内で暗黙的に安全な方法が他にもいくつかあります。 ...
Get Go言語による並行処理 now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.