PR:この記事にはアフィリエイトリンクが含まれます。
Goではgo f()で関数をgoroutineとして起動できます。実務で悩むのは、結果の受け取り方やキャンセル後の終了処理。並行処理の基本と、関連する本の扱う範囲を押さえていきます。
| 本 | 対象・内容 | 参考価格(税込) |
|---|---|---|
Go言語による並行処理 | goroutine、channel、キャンセルやリーク対策を深く学びたい人 | 3,080円 |
Go言語で学ぶ並行プログラミング 他言語にも適用できる原則とベストプラクティス | 並行処理の基本原則から学びたい経験者 | 3,850円 |
初めてのGo言語 第2版 ―他言語プログラマーのためのイディオマティックGo実践ガイド | Goの基礎と並行処理をまとめて学びたい人 | 4,950円 |
実用 Go言語 第2版 ―システム開発の現場で知っておきたいアドバイス | 業務で使う並行処理のパターンを知りたい人 | 4,620円 |
エキスパートたちのGo言語 一流のコードから応用力を学ぶ | 中級以上で実務やOSSのコードを読みたい人 | 3,278円 |
表の価格は各書籍の希望小売価格・定価です。実売価格は時期や販売店によって変わるため、購入時は書店の表示をご確認ください。
並行処理とは
並行処理は複数の仕事を進行中にする設計です。並列処理では、複数の仕事を実際に同時実行します。似た言葉ですが、Goの動きを追うときは区別しておくと分かりやすくなります。goroutineを使えば、関数を別の実行単位として動かせます。
たとえば、複数のURLへのリクエストやファイル処理を順番に行うと、待ち時間が積み重なります。互いに独立した処理を並行させれば、その待ち時間を重ねて進められるところがあります。
とはいえ、goroutineを増やせば必ず速くなるわけではありません。CPUやネットワーク、共有データへのアクセスが詰まっていると、数を増やしたぶん競合や管理の手間が膨らむこともあります。
goroutineの基本
go f()を実行すると、関数は別のgoroutineで動き始めます。呼び出し元は完了を待たずに先へ進みますが、戻り値はそのまま受け取れません。完了や結果を知らせる方法も、あわせて考えておきましょう。
複数の処理が終わるまで待つときは、sync.WaitGroupが基本です。goroutineを起動する前にAddし、処理の最後でDoneを呼びます。呼び出し側のWaitで完了を待つ、この流れですね。
入力の数だけgoroutineを起動すると、リクエストが集中したときに資源を使い切るおそれがあります。一定数のworkerに仕事を振れば、同時に動く処理を制限できます。数を管理しやすいのも利点です。
channelの役割
channelはgoroutineどうしで値を受け渡す仕組みです。ch <- valueで送り、value := <-chで受け取ります。値の流れがコードに表れるので、処理の境界を追いやすいですね。
バッファなしchannelでは、受信側が値を受け取るまで送信側が待ちます。容量を持たせると、空きがある間は送信を受け付けます。小さな待ち行列として考えると分かりやすいでしょう。
複数のchannel操作やctx.Done()を待つときは、selectが便利です。仕事を受け取りながらキャンセルも確認するworkerでは、処理を続けるか終えるかを決める要所になります。
channelを閉じるのは原則として送信側です。受信側が閉じると、その後の送信でpanicが起こります。送信側が複数ある場合は、すべての送信が終わったと確認してから閉じましょう。
停止と競合対策
goroutineは、呼び出し元の関数が終わっても自動では止まりません。受け手のいないchannelへの送信や、誰も受け取らない結果を待ち続ける処理はリークにつながります。起動時に終了条件も決めておく必要があります。
context.Contextを引数で渡せば、呼び出し側からキャンセルやタイムアウトを知らせられます。各goroutineがctx.Done()を確認して、channel待ちや長い処理から抜けられるようにします。
複数のgoroutineが同じ変数を読み書きすると、競合状態が起こることがあります。go test -raceは検出の助けになりますが、設計上の問題をすべて見つけるものではありません。
channelとmutexでは、得意な場面が異なります。値や仕事を受け渡すならchannel、共有状態を複数の処理から守るならmutexが合う場合もあります。どちらかに統一する必要はありません。
Go全体から学ぶ
『初めてのGo言語 第2版』は2025年刊、552頁のGo入門書です。goroutine、channel、selectから、バッファリングやクローズまで解説しています。並行処理の基礎をGo全体の学習につなげられる一冊です。
contextによる終了やタイムアウト、WaitGroup、バックプレッシャーも範囲に含まれます。章末問題で手を動かせる構成です。mutexやアトミック操作を使う場面も取り上げています。
Goの基礎と並行処理を一冊で学ぶなら、この本を最初に買うのが堅実です。他言語の経験をGoらしい実装につなげたい人にもおすすめします。
設計を掘り下げる
『Go言語で学ぶ並行プログラミング 他言語にも適用できる原則とベストプラクティス』は2024年刊、336頁です。プログラミング経験者向けで、GoまたはC言語系の基礎がある人を理想的な読者としています。
共有メモリとメッセージパッシングを軸に、goroutine、channel、selectを学べます。条件変数、セマフォ、アトミック、デッドロック回避も取り上げ、他言語にも通じる設計原則を解説します。
『Go言語による並行処理』は2018年刊、256頁です。goroutine、channel、selectのほか、WaitGroup、Mutex、RWMutexなど、Goの並行処理を掘り下げています。
パイプラインやファンアウト・ファンイン、goroutineリーク対策、contextによるキャンセルも扱います。競合状態の検出やpprof、traceまで学べるので、Goの基礎を知ったうえで並行処理を深く学びたい人におすすめです。
現場の型を学ぶ
『実用 Go言語 第2版』は2025年刊、496頁。業務でGoを使う人に向け、goroutineやchannelの基本から、ゴルーチンプール、処理速度制限、ファンアウト・ファンインまで紹介します。
contextを使ったエラー通知に加え、ループやchannel待ちによるリーク、そのテストでの検知も解説しています。並行処理を現場の開発に取り入れる人におすすめです。
『エキスパートたちのGo言語 一流のコードから応用力を学ぶ』は2022年刊、400頁です。中級以上のGoプログラマーに向け、OSSのコードや開発手法を紹介しています。
goroutine、channelパターン、contextの応用に加えて、並行性の問題検出も範囲に含まれます。実際のコードから応用力を身につけたい人に合うでしょう。
まとめ
goroutineは仕事を並行して動かす実行単位で、channelは値や仕事の受け渡しに使います。実践では完了を待つ方法、同時実行数、終了の合図もそろえて考えると、処理を追いやすくなります。
Go全体を学び始める人には『初めてのGo言語 第2版』、並行処理を集中して学ぶ人には『Go言語による並行処理』がおすすめです。他言語にも通じる設計原則を学びたい経験者には、Cutajarの本をすすめます。
実務パターンを探す人には『実用 Go言語 第2版』、OSSコードから応用力を高めたい人には『エキスパートたちのGo言語』をおすすめします。
Amazon の PC をスコア化してみた
Amazonにある8〜14インチの小型WindowsタブレットやノートPCを、スペック別にスコア化して比較・ランキング。






