阅读量:1
在Go语言中,可以使用sync
包中的WaitGroup
类型来实现高效并发处理任务。
WaitGroup
是一个计数信号量,用于等待一组goroutine完成任务。它提供了三个方法:Add()
、Done()
和Wait()
。
下面是一个使用WaitGroup
实现高效并发处理任务的示例代码:
package main import ( "fmt" "sync" ) func main() { numTasks := 10 var wg sync.WaitGroup for i := 0; i < numTasks; i++ { wg.Add(1) go func(taskID int) { defer wg.Done() processTask(taskID) }(i) } wg.Wait() fmt.Println("All tasks completed") } func processTask(taskID int) { fmt.Printf("Task %d started\n", taskID) // 模拟耗时操作 for i := 0; i < 100000000; i++ { } fmt.Printf("Task %d completed\n", taskID) }
在这个示例中,我们创建了10个任务,并把它们放入一个WaitGroup
中。在每个任务的goroutine中,我们调用Done()
方法来标记任务完成。
最后,在main
函数中调用Wait()
方法等待所有任务完成。一旦所有任务完成,我们就可以继续执行后续的代码。
通过使用WaitGroup
,我们可以高效地并发处理任务,而不需要手动管理goroutine的状态。当所有任务都完成时,我们可以继续执行后续的代码。
请注意,当使用WaitGroup
时,确保在每个任务的goroutine中调用Done()
方法,以便正确地减少计数器。否则,Wait()
方法将一直阻塞,导致程序无法继续执行。
此外,WaitGroup
的计数器也可以通过Add()
方法增加,以便在其他地方动态添加任务。同样,Done()
方法也可以在其他地方调用,以便在不同的位置标记任务完成。
总结起来,使用Go WaitGroup
可以方便地实现高效并发处理任务,它简化了并发编程的复杂性,并提供了一种优雅的方式来等待所有任务完成。