Goの非同期タスクキューをブロックしない方法

Go言語では、goroutineとchannelを使用して非同期タスクキューの処理を実現できます。非同期タスクキューは、タスクキューとして無バッファチャネルを使用し、タスクをチャネルに挿入し、続いてゴルーチンを使用してチャネルからタスクを読み込んで実行できます。

タスクキューでタスクの並列数を制限する必要がある場合、バッファ付きチャネルを使用して並列数を制御できます。たとえば、固定サイズのタスクキューを作成すると、キューがいっぱいになると新しいタスクがキューに空きができるまでブロックされます。

以下は、goroutineとchannelを使用した非同期処理タスクキューの処理方法を示す簡単なサンプルコードです。

package main
import (
"fmt"
"time"
)
func worker(id int, tasks <-chan int, results chan<- int) {
for task := range tasks {
fmt.Printf("Worker %d processing task %d\n", id, task)
time.Sleep(time.Second) // 模拟任务处理
results <- task * 2      // 将处理结果放入结果队列
}
}
func main() {
numWorkers := 3
numTasks := 10
tasks := make(chan int)
results := make(chan int)
// 启动多个worker goroutine
for i := 0; i < numWorkers; i++ {
go worker(i, tasks, results)
}
// 添加任务到任务队列
for i := 0; i < numTasks; i++ {
tasks <- i
}
// 关闭任务队列,等待所有任务完成
close(tasks)
// 从结果队列中读取结果
for i := 0; i < numTasks; i++ {
result := <-results
fmt.Printf("Result: %d\n", result)
}
}

この例では、3つのワーカーgoroutineを作成し、タスクをタスクキューに入れます。各ワーカーはタスクキューからタスクを読み取り、結果キューから処理結果を返します。メインgoroutineは結果キューから結果を読み込み、印刷します。

高ルーチンとチャネルを活用することで、非同期タスクキューにおける高い効率を維持しつつブロックの問題を回避できます。

bannerAds