Go言語で高い並列処理を実現する方法

Goはゴルーチンとチャンネルで同時並行性を実現します。

軽量スレッドのGoroutineはGolangに備わり、複数のGoroutineを同時に実行でき、しかも切り替えにかかるオーバーヘッドが小さい。新しいGoroutineは、キーワードgoを使って作成できる。例:

go func() {
    // 这里是并发执行的代码
}()

GoのGoroutine間の通信と同期を行うためのパイプがチャネルです。チャネルではGoroutine間で値の受け渡しができます。チャネルは非同期セーフなブロック送信・受信の仕組みを提供しています。例えば:

ch := make(chan int)  // 创建一个整数类型的Channel

go func() {
    ch <- 42  // 向Channel发送数据
}()

result := <-ch  // 从Channel接收数据

Goルーチンとチャネルを使うことで、高並行性プログラムを実現できます。並行実行するタスクをGoルーチンにカプセル化し、チャネルを介してデータの受け渡しや同期を行います。また、適切な並行制御メカニズム(WaitGroupやMutexなど)を使用することで、並行実行されるGoルーチンをより効果的に管理できます。

Goroutine と Channel を使った高並列カウンターの一例を以下に示します。

package main

import (
    "fmt"
    "sync"
)

func main() {
    counter := make(chan int)
    var wg sync.WaitGroup

    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func() {
            counter <- 1
            wg.Done()
        }()
    }

    go func() {
        wg.Wait()
        close(counter)
    }()

    sum := 0
    for n := range counter {
        sum += n
    }

    fmt.Println(sum)
}

チャネルを100個生成し、カウンターとして使用します。100個のゴルーチンからカウンターに数字1を送信し、WaitGroupで同期を行います。最後に、カウンターから受け取った数値を循環的に加算してsumにします。最終的な出力結果は100になります。

bannerAds