Skip to main content

Get full access to 実用 Go言語 ―システム開発の現場で知っておきたいアドバイス and 60K+ other titles, with a free 10-day trial of O'Reilly.

There are also live events, courses curated by job role, and more.

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をつけるだけで、ゴルーチンが作成され、並行処理が開始されます。他のプログラミング言語におけるスレッドと同じような使い方をしますが、次のような特徴があります。

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

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

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

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.

Don’t leave empty-handed

Get Mark Richards’s Software Architecture Patterns ebook to better understand how to design components—and how they should interact.

It’s yours, free.

Get it now
Cover of Software Architecture Patterns

Check it out now on O’Reilly

Dive in for free with a 10-day trial of the O’Reilly learning platform—then explore all the other resources our members count on to build skills and solve problems every day.

Start your free trial Become a member now