はじめに
この記事では、Go言語のマルチスレッド処理について深掘りします。Goの強力な機能であるGoroutinesとChannelsの使い方を学び、並行処理の基本を掴みましょう。
流行りに乗ってGo言語を使ってみた(インストールからHelloWorld表示まで)
Goroutines:Goの並行処理の基本
Goroutinesは、Go言語で並行処理を行うための仕組みです。他の言語のスレッドに似ていますが、より軽量で、さまざまな操作を同時に実行するための仕組みを提供します。ここでは、Goroutinesの基本的な使い方を示します。
package main
import (
"fmt"
"time"
)
func printNumbers() {
for i := 0; i < 10; i++ {
fmt.Println(i)
time.Sleep(time.Second)
}
}
func main() {
go printNumbers()
time.Sleep(5 * time.Second)
fmt.Println("Program finished.")
}
上記のコードでは、go printNumbers()と記述することで新たなGoroutineを作成しています。
コードを実行すると下記のようにコンソールに出力されます。見てわかるようにprintNumbers
関数が0〜9までコンソールに出力するようにしているにもかかわらず、0〜4で終わっています。これは、main関数でprintNumbers関数が終わる前に次の関数time.Sleepの処理を実行しているため、printNumbers関数が終わる前に処理が終了しています
0
1
2
3
4
Program finished.
Channels:Goroutines間でのデータのやり取り
Channelsは、Goroutines間でデータを安全にやり取りするための仕組みです。以下のコードでは、一つのGoroutineがChannelにデータを送信し、もう一つのGoroutineがそれを受け取っています。
package main
import (
"fmt"
"time"
)
func sendData(channel chan string) {
time.Sleep(time.Second)
channel <- "Hello, World!"
}
func main() {
messages := make(chan string)
go sendData(messages)
message := <-messages
fmt.Println(message)
}
ここでは、channel <- “Hello, World!”と記述してデータをChannelに送信し、message := <-messagesと記述してデータを受け取っています。
また、message := <-messagesと記述することで、データが返ってくるのを待ってくれるのでsendData
関数が終わるまでmain関数が終わることがなくなります
まとめ
Go言語のマルチスレッド処理は強力な機能であり、大規模なシステムのパフォーマンスを向上させるために必要な技術です。GoroutinesとChannelsを使いこなすことで、効率的な並行処理を実現することができます。
ぜひ今回学んだ内容を活
かして、自分自身のGoプロジェクトに取り組んでみてください。
さらに深く学びたい方には以下の参考資料を推奨します。
- Go by Example: Goroutines
- Go by Example: Channels
- Go Concurrency Patterns: Pipelines and cancellation
また、Go言語の並行処理に関する問題解決には、Stack OverflowのGo言語タグが役立つでしょう。多くのGoエンジニアが日々このコミュニティに貢献しており、困ったときにはここで解決策を見つけられます。