どのように並行して複数のゴルーチンを作成しますか?

Go言語では、goroutineを使用してマルチスレッドの並列実行を実現できます。goroutineはGo言語の軽量スレッドであり、プログラム内で多数のgoroutineを作成できます。goroutine間の切り替えとスケジューリングは、Go言語のランタイムによって自動的に行われます。

新しいgoroutineを作成するには、関数の呼び出しの直前に go キーワードを付けるだけです。たとえば:

package main

import (
    "fmt"
    "time"
)

func main() {
    // 创建一个新的goroutine
    go printNumbers()

    // 主goroutine继续执行其他任务
    for i := 0; i < 5; i++ {
        fmt.Println("Main goroutine:", i)
        time.Sleep(time.Second)
    }
}

func printNumbers() {
    for i := 0; i < 5; i++ {
        fmt.Println("New goroutine:", i)
        time.Sleep(time.Second)
    }
}

先の例では、go printNumbers() を使用して、printNumbers 関数を実行するための新しいゴルーチンを作成します。主ゴルーチンは for ループ中のタスクの実行を続け、一方新しいゴルーチンは printNumbers 関数中のタスクを並列実行します。

尚、メインゴリルーチンは終了するまで他のゴリルーチンが完了するのを待つことはないので、上記の例ではメインゴリルーチンと新規ゴリルーチンが同時に実行されて、交互に数字を印字することになります。

また、すべての goroutine が完了するまで待つために `sync.WaitGroup` を使用することもできる。例:

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup

    // 创建两个新的goroutine
    wg.Add(2)
    go printNumbers(&wg)
    go printLetters(&wg)

    // 等待所有的goroutine执行完毕
    wg.Wait()
}

func printNumbers(wg *sync.WaitGroup) {
    defer wg.Done()

    for i := 0; i < 5; i++ {
        fmt.Println("Numbers:", i)
        time.Sleep(time.Second)
    }
}

func printLetters(wg *sync.WaitGroup) {
    defer wg.Done()

    for i := 'A'; i < 'E'; i++ {
        fmt.Println("Letters:", string(i))
        time.Sleep(time.Second)
    }
}

上の例では、すべてのゴルーチンが完了するのを待つために、sync.WaitGroupを使用しています。まず、main関数でWaitGroupインスタンスを作成し、Addメソッドを呼び出して、待つ必要のあるゴルーチンの数を指定します。次に、各ゴルーチンの関数では、wg.Done()を呼び出して、現在のゴルーチンが完了したことを示します。最後に、main関数でwg.Wait()を呼び出して、すべてのゴルーチンが完了するのを待ちます。

上記2つの方法により、Go言語で複数のgoroutineを使用してマルチスレッドの同時実行が可能になります。

bannerAds