どのように並行して複数のゴルーチンを作成しますか?
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を使用してマルチスレッドの同時実行が可能になります。