本文へスキップ
BecomeCoder

Goコース · 第6章 並行処理 · レッスン21

goroutine ― 処理を同時に走らせる

ローカル実施

導入

goroutine(ゴルーチン) は「軽量な処理の並行実行単位」です。関数の呼び出しに go を付けるだけで、その処理を別の流れで同時に走らせられます。

説明

package main

import (
    "fmt"
    "time"
)

func task(name string) {
    for i := 1; i <= 3; i++ {
        fmt.Println(name, i)
        time.Sleep(100 * time.Millisecond)
    }
}

func main() {
    go task("A") // 別の流れで実行(すぐ次の行へ進む)
    task("B")    // こちらは通常どおり実行

    time.Sleep(500 * time.Millisecond) // A が終わるのを少し待つ
}
  • go task("A")taskgoroutine として起動main は完了を待たずに次へ進みます。
  • そのため AB の出力は入り混じって表示されます。
  • goroutine は数千個作っても軽い(OS のスレッドより小さい)のが Go の強みです。

注意:main 関数が終わると、走っている goroutine も強制的に打ち切られます。上の例で time.Sleep を入れているのは、A が終わるのを待つための一時しのぎです(次のレッスンで、待つための正しい方法を学びます)。

やってみよう

go task("A") から go を外すと、A → B の順に整列して実行されます。go を付けると同時に走り、出力が混ざる――この違いが並行処理の入り口です。