Goで非同期タスクキューの問題をどのように解決しますか

Goではgoroutineとchannelで非同期タスクキューの問題を解決できます。

非同期タスクキューを goroutine とチャネルを使用して実装する方法を説明する、簡単なサンプルコードを以下に示します。

package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Println("worker", id, "processing job", j)
time.Sleep(time.Second) // 模拟任务处理时间
results <- j * 2
}
}
func main() {
numJobs := 10
jobs := make(chan int, numJobs)
results := make(chan int, numJobs)
// 启动多个worker goroutine
numWorkers := 3
var wg sync.WaitGroup
for i := 1; i <= numWorkers; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
worker(id, jobs, results)
}(i)
}
// 发送任务到任务队列
for j := 1; j <= numJobs; j++ {
jobs <- j
}
close(jobs)
// 收集任务处理结果
go func() {
wg.Wait()
close(results)
}()
// 输出任务处理结果
for r := range results {
fmt.Println("result:", r)
}
}

上記のコードでは、2つのチャネル引数jobsとresultsを受け取るworker関数が最初に定義されます。jobsはタスクを受け取り、resultsはタスク処理の結果を送信するために使用されます。

そして、main関数ではまず、ジョブキューとジョブ処理結果の通信に使うチャネルjobsとresultsを生成しています。

続いて、goキーワードを使って複数のワーカーgoroutineが起動され、jobsチャンネルを介してタスクがタスクキューに送信される。

最後に、全てのタスク処理の完了を待機するための goroutine を起動し、results channel をクローズします。その後、メインの goroutine で results channel をイテレートし、逐次タスク処理の結果を出力しています。

goroutineとchannelを用いて、効果的な非同期タスクキューを実現し、並列処理能力を高めます。

bannerAds