在Go语言中,可以使用goroutine和channel来解决异步任务队列的问题。
下面是一个简单的示例代码,演示了如何使用goroutine和channel来实现异步任务队列:
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)
}
}
在上述代码中,首先定义了一个worker
函数,该函数接收两个channel参数:jobs
用于接收任务,results
用于发送任务处理结果。
然后,在main
函数中,首先创建了两个channel:jobs
和results
,分别用于任务队列和任务处理结果的通信。
接着,通过使用go
关键字启动了多个worker goroutine,并通过jobs
channel将任务发送到任务队列中。
最后,通过启动一个goroutine来等待所有任务处理完成,并关闭results
channel。然后,在主goroutine中遍历results
channel,逐个输出任务处理结果。
通过使用goroutine和channel,可以实现高效的异步任务队列,提高并发处理能力。