Go WaitGroup是Go语言中的一个并发原语,用于等待一组goroutine完成任务。它通常与通道(channel)一起使用,以实现并发任务的同步和协调。
WaitGroup是一个计数信号量,用于等待一组goroutine完成任务。它提供了三个主要的方法:Add()、Done()和Wait()。
通过结合通道(channel),可以实现更灵活的并发控制。通道可以用于传递任务给goroutine,并且可以在任务完成时通知主goroutine。
下面是一个示例代码,演示了如何使用WaitGroup和通道实现并发任务的同步:
package main
import (
"fmt"
"sync"
)
func worker(id int, tasks <-chan int, results chan<- int, wg *sync.WaitGroup) {
defer wg.Done()
for task := range tasks {
// 执行任务
result := task * 2
// 将结果发送到结果通道
results <- result
fmt.Printf("Worker %d processed task %d\n", id, task)
}
}
func main() {
numTasks := 10
numWorkers := 3
// 创建任务通道和结果通道
tasks := make(chan int, numTasks)
results := make(chan int, numTasks)
// 创建WaitGroup
var wg sync.WaitGroup
// 启动多个goroutine进行任务处理
for i := 1; i <= numWorkers; i++ {
wg.Add(1)
go worker(i, tasks, results, &wg)
}
// 发送任务到任务通道
for i := 1; i <= numTasks; i++ {
tasks <- i
}
close(tasks)
// 等待所有goroutine完成任务
wg.Wait()
// 关闭结果通道
close(results)
// 输出结果
for result := range results {
fmt.Println("Result:", result)
}
}
在这个示例中,我们创建了一个任务通道和一个结果通道,并通过WaitGroup来等待所有的goroutine完成任务。主goroutine将任务发送到任务通道,然后等待所有任务完成后,从结果通道中读取结果并输出。
这种使用WaitGroup和通道的方式可以实现高效的并发任务处理,可以应用于各种需要并发处理的场景,如批量数据处理、并行计算等。
推荐的腾讯云相关产品:腾讯云云服务器(CVM)和腾讯云容器服务(TKE)。腾讯云云服务器提供了弹性、可靠的云服务器实例,可以满足各种计算需求;腾讯云容器服务提供了高度可扩展的容器集群管理服务,可以方便地部署和管理容器化应用。
更多关于腾讯云云服务器的信息,请访问:腾讯云云服务器
更多关于腾讯云容器服务的信息,请访问:腾讯云容器服务
领取专属 10元无门槛券
手把手带您无忧上云