Go言語での並列、非同期処理:GoroutinesとChannelsの使い方

Go

はじめに

この記事では、Go言語のマルチスレッド処理について深掘りします。Goの強力な機能であるGoroutinesとChannelsの使い方を学び、並行処理の基本を掴みましょう。

流行りに乗ってGo言語を使ってみた(インストールからHelloWorld表示まで)

流行りに乗ってGo言語を使ってみた(インストールからHelloWorld表示まで)
Go言語とは 2009年、GoogleでRobert Griesemer、ロブ・パイク、ケン・トンプソンによって設計された。Goは、静的型付け、C言語の伝統に則ったコンパイル言語、メモリ安全性、ガベージコレクション、構造的型付け(英語版)、...

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プロジェクトに取り組んでみてください。

さらに深く学びたい方には以下の参考資料を推奨します。

  1. Go by Example: Goroutines
  2. Go by Example: Channels
  3. Go Concurrency Patterns: Pipelines and cancellation

また、Go言語の並行処理に関する問題解決には、Stack OverflowのGo言語タグが役立つでしょう。多くのGoエンジニアが日々このコミュニティに貢献しており、困ったときにはここで解決策を見つけられます。