在Golang中,可以使用Go WaitGroup来同步并发操作。WaitGroup是一个计数器,用于等待一组goroutine完成任务。
当我们需要异步处理多个任务时,可以使用WaitGroup来等待所有任务完成。下面是一种巧妙地结合异步处理和WaitGroup的方法:
首先,创建一个WaitGroup对象,并设置计数器的初始值为任务的数量。var wg sync.WaitGroupwg.Add(numTasks)在处理每个任务时,使用goroutine来异步执行任务,并在任务完成时调用Done方法减少计数器的值。for _, task := range tasks {go func(t Task) {// 处理任务 t// ...// 任务完成时调用Done方法wg.Done()}(task)}在所有任务都启动后,使用Wait方法来等待所有任务完成。wg.Wait()这样,我们就可以同时处理多个任务,并在所有任务完成后继续执行后续操作。
完整的示例代码如下:
package mainimport ("fmt""sync""time")type Task struct {id int}func main() {numTasks := 10tasks := make([]Task, numTasks)var wg sync.WaitGroupwg.Add(numTasks)for i := 0; i < numTasks; i++ {tasks[i] = Task{id: i}go func(t Task) {// 模拟处理任务time.Sleep(1 * time.Second)fmt.Printf("Task %d done\n", t.id)// 任务完成时调用Done方法wg.Done()}(tasks[i])}// 等待所有任务完成wg.Wait()fmt.Println("All tasks done")}输出结果:
Task 1 doneTask 2 doneTask 5 doneTask 8 doneTask 4 doneTask 9 doneTask 6 doneTask 7 doneTask 3 doneTask 0 doneAll tasks done通过巧妙地结合异步处理和WaitGroup,我们可以高效地处理并发任务,并在所有任务完成后继续执行后续操作。