Goルーチン数を制限する方法

Go言語では、セマフォを使用してゴルーチンの数を制限できます。セマフォはマルチスレッド同期用のプリミティブで、共有リソースへのアクセスを制御するために使用します。

Go 言語の sync パッケージ内の Semaphore を使用してセマフォを実装できます。sync パッケージには、一連のゴルーチンが完了するまでを待機するため WaitGroup 型が用意されています。

以下に、セマフォを使用してゴルーチンの数を制限する方法を示すサンプルコードを示します。

package main

import (
	"fmt"
	"sync"
)

func worker(id int, semaphore chan struct{}, wg *sync.WaitGroup) {
	// 从信号量中获取一个许可
	semaphore <- struct{}{}

	// 执行工作
	fmt.Println("Worker", id, "start")
	// 模拟工作
	for i := 0; i < 5; i++ {
		fmt.Println("Worker", id, "working", i)
	}
	fmt.Println("Worker", id, "done")

	// 释放许可,使其他协程可以获取
	<-semaphore

	// 通知WaitGroup,当前协程已完成
	wg.Done()
}

func main() {
	const numWorkers = 3
	semaphore := make(chan struct{}, numWorkers) // 创建大小为numWorkers的信号量
	var wg sync.WaitGroup

	for i := 0; i < 10; i++ {
		wg.Add(1)
		go worker(i, semaphore, &wg)
	}

	wg.Wait() // 等待所有协程完成
}

上記のコードでは、コルーチンの数を制御するために、numWorkers のサイズのセマフォ semaphore を作成します。各コルーチンは、動作の開始前に、セマフォから 1 つの許可を取得します。動作が完了したら、その許可を解除して、他のコルーチンが取得できるようにします。これにより、同時に実行されるコルーチンの数を numWorkers に制限できます。

セマフォチャネルのバッファサイズは、同時に実行されるゴルーチン数を決定することに注意してください。セマフォを作成するときは、実際の要件に基づいて適切なバッファサイズを選択できます。

bannerAds