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

GolangGolangBeginner
今すぐ練習

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

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/ConcurrencyGroup(["Concurrency"]) go/ConcurrencyGroup -.-> go/goroutines("Goroutines") subgraph Lab Skills go/goroutines -.-> lab-15479{{"Go 言語の goroutine による並列処理"}} end

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が実行を終了するのを待つ方法も学びました。