Goroutine超入門!Goの並行処理を初心者向けに解説

Go言語
この記事は約6分で読めます。
Go初学者
Go初学者

並行処理って、他のプログラミング言語では難しいです…Go言語はどうなのかな?

この記事ではGo言語の並行処理の基本が理解できます!
  • Goroutineについて
  • Go言語の並行処理をプログラムで確認できます

Go言語の特徴のひとつである「並行処理を簡単に実装できる」ことを確認します。

他のプログラミング言語では実装が難しい並行処理ですが、Go言語の並行処理のプログラムを確認することでGo言語の魅力を知る一歩になるはずです。

今回は、単純なプログラムですからプログラミング初心者の方にも理解しやすいでしょう。

もりぴ
この記事を書いた人

XHTML1.0時代にHTML&CSSを勉強した経験あり。無趣味だった私が2020年5月からプログラミング学習を開始し現在も挫折せずに趣味で学習を楽しんでいる51歳。プログラミングの楽しさをブログを通してお伝えしていきます。

もりぴをフォローする

Go言語の並行処理 Goroutineとは?

GoroutineはGo文で関数を指定することで、並行処理を簡単に実現できる機能

もりぴ
もりぴ

まずは、ここを押さえておきましょう!

Go言語の並行処理を理解する一歩目です。

Go言語の並行処理 Goroutineの機能をプログラムで確認

それではGo言語の並行処理 Goroutineの機能をプログラムで確認していきますが、少しづつGoroutineによる並行処理が理解できるように紹介していきます。

順次処理によるプログラムを確認

Goroutineで並行処理しない、上から順番に処理をする順次処理のプログラムを確認します。

今回、2つの関数を用意してプログラムを実行してみます。

// 順次処理によるプログラムを確認
package main

import (
    "fmt"
    "time"  // 時間の測定と表示機能
)

func loop(s string) {
    for i := 0; i < 5; i++ {
        // 100ミリ秒ごとに実行
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func subLoop(s string) {
    for i := 0; i < 5; i++ {
        // 150ミリ秒ごとに実行
        time.Sleep(150 * time.Millisecond)
        fmt.Println(s)
    }
}

func main() {
    loop("Hello")
    subLoop("World")
}
// 出力結果
$ go run main.go 
Hello  // 100ミリ秒ごとに表示
Hello
Hello
Hello
Hello
World  // 150ミリ秒ごとに表示
World
World
World
World

timeパッケージは時間の測定と表示を機能とする標準パッケージ

もりぴ
もりぴ

今回はtimeパッケージを使用しているので "time"import で指定しています。

このプログラムは loop() 関数 でfor文の処理を100ミリ秒ごとに実行して loop() 関数 の処理が終了したら、subLoop() 関数 の処理が始まります。

subLoop() 関数 のfor文の処理は150ミリ秒ごとに実行しています。

順次処理なので loop() 関数 の処理が終了したら、次の subLoop() 関数 が始まっていることが確認できます。

Goroutineの機能を使用して並行処理を確認する

それでは、Goroutineでの並行処理を確認していきます。

Goroutineの実装は下記の通りです。

go 関数名(引数)

// 順次処理によるプログラムを確認
package main

import (
    "fmt"
    "time"  // 時間の測定と表示機能
)

func loop(s string) {
    for i := 0; i < 5; i++ {
        // 100ミリ秒ごとに実行
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func subLoop(s string) {
    for i := 0; i < 5; i++ {
        // 150ミリ秒ごとに実行
        time.Sleep(150 * time.Millisecond)
        fmt.Println(s)
    }
}

func main() {
    // go文でひとつの関数を並行処理
    go loop("Hello")
    subLoop("World")
}
// 出力結果
$ go run main.go 
Hello  // 2つの関数の処理が並行処理されている
World
Hello
Hello
World
Hello
World
Hello
World
World

loop() 関数 の方に go を付けただけで並行処理が実現されたことが確認できました。

もりぴ
もりぴ

並行処理が簡単に実装されましたね!

【参考】無名関数を並行処理する

Goroutineでは、通常の関数だけでなく無名関数も並行処理することができます。

// 無名関数を並行処理する
package main

import (
    "fmt"
    "time"  // 時間の測定と表示機能
)

func subLoop(s string) {
    for i := 0; i < 5; i++ {
        // 150ミリ秒ごとに実行
        time.Sleep(150 * time.Millisecond)
        fmt.Println(s)
    }
}

func main() {
    // 無名関数を並行処理する
    go func () {
        fmt.Println("Golang")
    }()

    subLoop("World")
}
// 出力結果
$ go run main.go
Golang
World
World
World
World
World
もりぴ
もりぴ

無名関数もGoroutineで並行処理できる点を押さえておきましょう。

【まとめ】Go言語のGoroutineによる並行処理

今回はGoroutineで並行処理のプログラムで動きを確認しました。

できれば、紹介したプログラムを実際にエディタでコードを書いて動きを確認してみてください。

では、まとめにはいります。

この記事で押さえておくべきこと!
  • GoroutineはGo文で関数を指定することで、並行処理を簡単に実現できる機能
  • Goroitineの実装は go 関数名(引数)
  • 無名関数も並行処理できる
  • timeパッケージは時間の測定と表示を機能とする標準パッケージ

以上です。

これからGo言語の並行処理を学んでいく上で、最低限知ってほしいことだけお伝えしました。

まずは「Go言語で並行処理は簡単に実装できる』ということを確認できれば大丈夫です。

しかし、今回のプログラムは並行処理を完全に終了されるプログラムとしては不完全です。

Go言語で並行処理を、完全に終了するひとつの方法を下記の記事でお伝えしています。

ぜひ、参考にしてみてください。

comment

タイトルとURLをコピーしました