『自由力』を身に付けるサイト「リバトレ」も見てね!!

【Go】ゴルーチン入門!並列処理が簡単にできるーチン!

悩んでいる男の子

Go言語のゴルーチンが良く分からないから教えてほしいんだけど。。
具体的なソースコードもあると嬉しいな。

こんな悩みを解決します。

  • 本記事の内容
  • ゴルーチンの実装例
  • ゴルーチンを使用する際の注意点
  • ゴルーチンの具体的なソースコード
  • 本記事の執筆者
プロフィール
どこの写真だよ
  • 長身ガリガリ自称イケメン(1993/4/1生)
  • 元エンジニア(歴7年)、資格保有数約20個(IT系以外も含む)
  • 副業(物販)5か月目で月利30万円⇒脱サラ
  • 物販、システム開発、アフィリエイト、投資を細々とやっています。
  • 物販は彼女と楽しみながらやってます!

今回は、 Go言語のゴルーチンについて解説していきます

いずみん

本記事を読めばゴルーチンの基礎が理解できるので、最後まで読んでみてください!

目次

ゴルーチンとは?

ゴルーチンとは、Go言語のプログラムで並行に実行されるもののことを指します。

Go言語は並列処理が得意な言語として知られています。

ゴルーチンを使用せずに実行してみる

package main

import (
	"log"
	"strconv"
	"time"
)

// スリープさせる
func sleep(i int) {
	log.Print(strconv.Itoa(i + 1) + "回目")

	time.Sleep(1 * time.Second)
}

// メイン関数
func main() {
	const sleepSecondTime int = 3

	log.Print("start")

	for i := 0; i < sleepSecondTime; i ++ {
        sleep(i)
	}

	log.Print("end")
}

処理を1秒間停めるsleep関数を3回呼んでいるだけです。

Desktop\git\go-lang\goroutine> go run .\main.go
2020/03/21 02:11:06 start
2020/03/21 02:11:06 1回目
2020/03/21 02:11:07 2回目
2020/03/21 02:11:08 3回目
2020/03/21 02:11:09 end

ログを見ると、ちゃんと3秒かかっていますね。

ゴルーチンを使用して実行してみる

ゴルーチンを使用するには、関数呼び出し時に「go」を指定します。

package main

import (
	"log"
	"strconv"
	"time"
)

// スリープさせる
func sleep(i int) {
	log.Print(strconv.Itoa(i + 1) + "回目")

	time.Sleep(1 * time.Second)
}

// メイン関数
func main() {
	const sleepSecondTime int = 3

	log.Print("start")

	for i := 0; i < sleepSecondTime; i ++ {
        go sleep(i)  // ゴルーチン使用
	}

	log.Print("end")
}

sleep関数を、ゴルーチンを使用して呼び出します。

Desktop\git\go-lang\goroutine> go run .\main.go
2020/03/21 02:13:50 start
2020/03/21 02:13:50 end

sleep関数を呼んだ形跡が全くないですね。。

ゴルーチンの注意点

ゴルーチンを使用した場合、main関数の処理が終われば自動的にすべての処理が終了します

今回の例だと、ゴルーチンを使用したことで、sleep関数はmain関数の管理下ではなくなることになります

これはチャネルを使うなどして回避できますが、今回はゴルーチンをいい感じに使ってみたいだけなので、一旦main関数の最後にsleep関数を仕込んでみます

ゴルーチンを使用して再度実行してみる

package main

import (
	"log"
	"strconv"
	"time"
)

// スリープさせる
func sleep(i int) {
	log.Print(strconv.Itoa(i + 1) + "回目")

	time.Sleep(1 * time.Second)
}

// メイン関数
func main() {
	const sleepSecondTime int = 3

	log.Print("start")

	for i := 0; i < sleepSecondTime; i ++ {
        go sleep(i)  // ゴルーチン使用
	}

	time.Sleep(4 * time.Second)

	log.Print("end")
}

一旦4秒スリープさせました。

Desktop\git\go-lang\goroutine> go run .\main.go
2020/03/21 02:18:51 start
2020/03/21 02:18:51 1回目
2020/03/21 02:18:51 3回目
2020/03/21 02:18:51 2回目
2020/03/21 02:18:55 end

main関数内で4秒止めているので全体は4秒かかっていますが、sleep関数はゴルーチンを使用したので、すべて51秒のタイミングで並列実行されています。

これで、ゴルーチンの使用により並列処理が行われていることが確認できまし

まとめ

今回は、 Go言語のゴルーチンについて解説しました

並列処理を簡単に行ってくれるので、意外と便利な機能ですね。

ではまた!

  • おススメ本はこちら!
いずみん

僕は↓の本でGoの勉強をしました!
非常に分かりやすいので是非!

¥3,410 (2021/12/09 18:37時点 | Amazon調べ)
  • 関連記事
【Go】ゴルーチン入門!並列処理が簡単にできるーチン!

この記事が気に入ったら
フォローしてね!

シェアするんやで!

~ リバトレ ~

お金や副業に関する情報を発信しているよ!

この記事を書いた人

いずみんのアバター いずみん 自由力発信おじ

【自由力発信】うさんくさ笑 | 副業物販で5ヶ月目に月利30万円達成⇨脱サラ予定 | 物販(アパレルせどり)・アフィリエイト・投資で自由になるための情報を発信中?笑 | 元エンジニア | 保有資格約20個

関連記事

コメント

コメントする

目次
閉じる