Go by Example: WaitGroups

文章介绍了Go语言中使用sync.WaitGroup来等待多个goroutine完成的机制。通过创建一个WaitGroup,启动协程并在完成时调用Done()方法,主线程可以在所有工作协程完成后继续执行。示例代码展示了如何在实践中使用WaitGroup。
摘要由CSDN通过智能技术生成

英文源地址
为了等待多个goroutine完成, 我们可以使用WaitGroup.

package main

import (
	"fmt"
	"sync"
	"time"
)

// 这个函数我们将在每个goroutine中运行
func worker(id int) {
	fmt.Printf("Worker %d starting\n", id)
	time.Sleep(time.Second)
	fmt.Printf("Worker %d done\n", id)
}

func main() {
	// 这个WaitGroup用于等待这里启动的所有协程完成.
	// 注意: 如果WaitGroup显式地传递给函数, 它应该通过指针进行.
	var wg sync.WaitGroup

	// 启动几个协程, 并为每个协程在WaitGroup计数器中进行增加
	for i := 1; i <= 5; i++ {
		wg.Add(1)

		// 避免在每个协程闭包中重复使用相同的值.具体细节可以参考FAQ
		i := i

		// 将worker调用包装在闭包中, 确保告诉WaitGroup这个worker已经完成.
		// 这样, 工作协程不必直到其执行中涉及的并发原语.
		go func() {
			defer wg.Done()
			worker(i)
		}()
	}
	// 阻塞, 直到WaitGroup计数器返回0;所有worker都通知已完成.
	wg.Wait()
	// 请注意, 这种方法没有直接的方法从worker中传递error.对于更进阶的用例, 请参考errgroup包.
}
$ go run waitgroups.go
Worker 5 starting
Worker 3 starting
Worker 4 starting
Worker 1 starting
Worker 2 starting
Worker 4 done
Worker 1 done
Worker 2 done
Worker 5 done
Worker 3 done

对于每次调用, worker协程的启动和结束顺序可能不一样.
下一节将介绍: Rate Limiting速率控制.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值