
並行処理って、他のプログラミング言語では難しいです…Go言語はどうなのかな?
Go言語の特徴のひとつである「並行処理を簡単に実装できる」ことを確認します。
他のプログラミング言語では実装が難しい並行処理ですが、Go言語の並行処理のプログラムを確認することでGo言語の魅力を知る一歩になるはずです。
今回は、単純なプログラムですからプログラミング初心者の方にも理解しやすいでしょう。
Go言語の並行処理 Goroutineとは?

まずは、ここを押さえておきましょう!
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"
を import
で指定しています。
このプログラムは loop() 関数
でfor文の処理を100ミリ秒ごとに実行して loop() 関数
の処理が終了したら、subLoop() 関数
の処理が始まります。
subLoop() 関数
のfor文の処理は150ミリ秒ごとに実行しています。
順次処理なので loop() 関数
の処理が終了したら、次の subLoop() 関数
が始まっていることが確認できます。
Goroutineの機能を使用して並行処理を確認する
それでは、Goroutineでの並行処理を確認していきます。
Goroutineの実装は下記の通りです。
// 順次処理によるプログラムを確認
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で並行処理のプログラムで動きを確認しました。
できれば、紹介したプログラムを実際にエディタでコードを書いて動きを確認してみてください。
では、まとめにはいります。
以上です。
これからGo言語の並行処理を学んでいく上で、最低限知ってほしいことだけお伝えしました。
まずは「Go言語で並行処理は簡単に実装できる』ということを確認できれば大丈夫です。
しかし、今回のプログラムは並行処理を完全に終了されるプログラムとしては不完全です。
Go言語で並行処理を、完全に終了するひとつの方法を下記の記事でお伝えしています。
ぜひ、参考にしてみてください。
comment