Go 言語の goroutine による並列処理

Beginner

This tutorial is from open-source community. Access the source code

はじめに

この実験は、Go 言語における goroutine の理解度をテストするために設計されています。goroutine は、軽量の実行スレッドであり、関数の並列実行を可能にします。

goroutine

この実験で解くべき問題は、関数を並列実行するための goroutine を作成して実行することです。

  • f関数は、入力文字列とカウンタ変数を 3 回出力する必要があります。
  • main関数は、f関数を同期的に呼び出し、「direct」とカウンタ変数を 3 回出力する必要があります。
  • main関数は、goroutine を使用してf関数を非同期的に呼び出し、「goroutine」とカウンタ変数を 3 回出力する必要があります。
  • main関数は、メッセージを出力する匿名関数を実行する goroutine を起動する必要があります。
  • main関数は、「done」を出力する前に、goroutine が実行を終了するのを待つ必要があります。
## このプログラムを実行すると、ブロッキング呼び出しの出力が最初に表示され、その後 2 つの goroutine の出力が表示されます。goroutine の出力は、Go 実行時に並列実行されているため、入れ子になっている場合があります。

## 次に、並列 Go プログラムにおける goroutine の補完機能であるチャネルを見てみましょう。

以下に完全なコードがあります。

// _goroutine_は、軽量の実行スレッドです。

package main

import (
    "fmt"
    "time"
)

func f(from string) {
    for i := 0; i < 3; i++ {
        fmt.Println(from, ":", i)
    }
}

func main() {

    // 関数呼び出し `f(s)` があるとしましょう。通常の方法でそれを呼び出し、同期的に実行するには、次のようになります。
    f("direct")

    // goroutine でこの関数を呼び出すには、`go f(s)`を使用します。この新しい goroutine は、呼び出し元の goroutine と並列に実行されます。
    go f("goroutine")

    // 匿名関数呼び出しのための goroutine も起動できます。
    go func(msg string) {
        fmt.Println(msg)
    }("going")

    // これら 2 つの関数呼び出しは、現在別々の goroutine で非同期に実行されています。完了するのを待ちます(より堅牢なアプローチとして、[WaitGroup](waitgroups) を使用します)。
    time.Sleep(time.Second)
    fmt.Println("done")
}

まとめ

この実験では、関数を並列実行するための goroutine を作成して実行する方法を学びました。また、匿名関数を実行する goroutine を起動する方法と、goroutine が実行を終了するのを待つ方法も学びました。