16.1 並行処理の基本を知る

Goの並行処理は、ライブラリなどを使って実行するのではなく、言語自体に文法として組み込まれています。次の3つが、Go並行処理プリミティブの三種の神器です。

  • ゴルーチン(goroutine)

  • チャネル(channel)

  • select

このうち、selectは「16.4 チャネルのブロッキングを中断する(何も起きていないことを検知する) 」で詳しく紹介します。また、4つ目のプリミティブとして、Go 1.7から コンテキスト が導入されました。コンテキストには2つの役割があり、それぞれを「16.5 ゴルーチン間のイベント伝達 」と「16.8 ウェブサービスでセッションの情報を共有する 」で取りあげます。

16.1.1 ゴルーチン

まずはゴルーチンです。

リスト16-1: ゴルーチンの例
	fmt.Println("ゴルーチンを実行します")
	go func() {
		fmt.Println("ゴルーチンが実行しています")
	}()

	fmt.Println("ゴルーチンの終了を待ちます")
	time.Sleep(time.Second) // 説明のためにあえて悪いコードを使っています
	fmt.Println("ゴルーチンが終了しました")
	// ゴルーチンを実行します
	// ゴルーチンの終了を待ちます
	// ゴルーチンが実行しています
	// ゴルーチンが終了しました

任意の関数やメソッド呼び出しの前にgoをつけるだけで、ゴルーチンが作成され、並行処理が開始されます。他のプログラミング言語におけるスレッドと同じような使い方をしますが、次のような特徴があります。

  • 個々のゴルーチンを識別できない

  • 優先度や親子関係はない

  • 外部から終了させることはできない ...