首先,我们需要了解一下waitgroup的作用。waitgroup用于等待一组并发任务完成后再继续执行后续的代码。通常情况下,我们需要在主协程等待其他协程完成某个任务再继续向下执行时,就可以使用waitgroup。
在go语言的sync包下,有一个waitgroup结构体,它具有3个主要的方法,分别是add()、done()和wait()。下面我们逐一介绍它们的作用。
首先是add()方法,它用于增加等待的任务数。我们可以通过调用add()方法来告诉waitgroup我们有多少个任务需要等待完成。具体的调用方式是wg.add(n),其中n表示需要等待的任务数量。例如,如果我们有10个任务需要等待完成,就可以调用wg.add(10)。
然后是done()方法,它用于标志当前任务已经完成。每个任务完成时,都需要调用done()方法告诉waitgroup当前任务已经完成。具体的调用方式是wg.done()。通常情况下,我们会在任务完成后的defer语句中调用done()方法,以确保任务完成后一定会调用done()方法。
最后是wait()方法,它用于阻塞主协程,直到所有任务都已经完成。当主协程需要等待一组任务完成后再继续执行后续的代码时,可以调用wait()方法。具体的调用方式是wg.wait()。wait()方法会一直阻塞,直到所有任务都已经完成。
下面我们通过一个实例来演示waitgroup的具体应用。假设我们有一个任务列表,我们需要并发地处理这些任务。在每个任务完成后,我们都会将结果写入一个结果列表。最后,我们需要等待所有任务都完成后,才能打印出结果列表。代码如下所示:
package mainimport ( "fmt" "sync")func main() { var wg sync.waitgroup tasklist := []string{"task1", "task2", "task3", "task4"} // 创建结果列表 resultlist := make([]string, len(tasklist)) // 遍历任务列表,开启多个协程处理任务 for i, task := range tasklist { wg.add(1) // 增加等待的任务数 go func(index int, task string) { defer wg.done() // 标志任务已经完成 // 模拟任务处理过程 result := fmt.sprintf("task %s processed", task) // 将结果写入结果列表 resultlist[index] = result }(i, task) } wg.wait() // 等待所有任务完成 // 打印结果列表 for _, result := range resultlist { fmt.println(result) }}
在上面的代码中,首先我们创建了一个waitgroup对象wg。然后,我们遍历任务列表,针对每个任务调用了一次wg.add(1),表示有一个任务需要等待。在每个任务的处理函数中,我们在任务完成后调用了一次wg.done()。最后,我们在主协程中调用了wg.wait()来等待所有任务都完成。
通过这样的设计,我们可以并发地处理任务,并且确保在所有任务都完成后,再继续主协程的后续执行。最后,我们打印出了结果列表,验证了任务的并发处理和结果的正确性。
总结来说,waitgroup是go语言中非常实用的并发工具。通过合理使用waitgroup,我们可以更好地管理并发任务,确保任务的顺序和正确性。希望本文能够帮助读者更好地理解和应用waitgroup。
以上就是go waitgroup的使用方式及实例详解的详细内容。
