Goroutineの基本

Go言語における**Goroutine(ゴルーチン)**は、軽量なスレッドのようなもので、Goが提供する並行処理の中心的な機能です。Goroutineを使うことで、プログラムの複数の処理を同時に実行することができます。以下に、Goroutineの基本について詳しく説明します。


1. Goroutineとは何か

Goroutineは、Goランタイムによって管理される**軽量な実行単位(軽量スレッド)**です。Goroutineは非常に軽く、数千~数百万単位で同時に実行することも可能です。

Goでは、Goroutineを使って並行処理を簡単に書くことができます。


2. Goroutineの実行方法

関数をGoroutineとして実行するには、その関数呼び出しの前に go キーワードを付けます。

go
package main import ( "fmt" "time" ) func sayHello() { fmt.Println("Hello from goroutine") } func main() { go sayHello() // Goroutineとして関数を呼び出す time.Sleep(1 * time.Second) // メイン関数がすぐに終了しないように待機 fmt.Println("Main function finished") }

解説:

  • go sayHello() のように記述することで、sayHello 関数が新しいGoroutineとして並行実行されます。

  • main 関数が終了するとすべてのGoroutineも終了するため、time.Sleep で待機時間を入れて実行を確認しています。


3. Goroutineの特徴

  • 軽量性: 一つのGoroutineは数KBのスタックサイズで始まり、必要に応じて自動で拡張されます。

  • 低オーバーヘッド: OSスレッドよりもオーバーヘッドが少なく、大量に起動してもパフォーマンスが保たれます。

  • Goランタイムによるスケジューリング: GoroutineはGoランタイムのスケジューラによって管理され、利用可能なCPUコアに分配されます(M:Nスケジューリングモデル)。


4. Goroutineの注意点

  • 同期の必要性: 複数のGoroutineが同じリソース(変数など)にアクセスすると、競合状態(race condition)になる可能性があります。

  • 同期にはChannelやMutexを使用: Goではchannelsync.Mutexなどを使ってGoroutine間の通信や同期を行います。


5. Goroutineを使う主な場面

  • 並列ダウンロードやファイル処理

  • Webサーバーにおけるリクエストごとの処理

  • 非同期I/O操作(例: データベースアクセス、API呼び出し)


まとめ

項目 説明
概要 軽量な並行処理単位(軽量スレッド)
実行方法 go 関数名()
メリット 軽量、高速、スケーラブル
注意点 同期を行わないと競合状態が発生する可能性あり
主な用途 並列処理、非同期処理、Webサーバーの並列リクエスト処理など

生成日:2025/05/03