您的位置 首页 知识分享

Go 协程如何实现等待多个协程完成?

如何使用 go 协程实现等待多个协程 为了实现主协程等待多个子协程执行完毕的效果,类似于 sync.wtgro…

Go 协程如何实现等待多个协程完成?

如何使用 go 协程实现等待多个协程

为了实现主协程等待多个子协程执行完毕的效果,类似于 sync.wtgroup,可以使用 go 中的 channel 或 context。

使用 channel

通过创建一个固定容量的 channel,可以实现此功能。当每个子协程完成时,它会向这个 channel 发送一个值以表明完成。

num := 10 ch := make(chan int, num)  for i := 0; i < num; i++ {     go func(ch chan int, key int) {         // ...         ch <- key     }(ch, i) }  for i := 0; i < num; i++ {     key := <-ch     // ... }
登录后复制

使用 context

也可以使用 context 来实现等待多个协程。context 提供了一种取消和管理协程生命周期的机制。

ctx, cancel := context.withtimeout(context.background(), 10*time.second) defer cancel()  for i := 0; i < num; i++ {     go func(ctx context.context, key int) {         // ...     }(ctx, i) }  select { case <-ctx.done():     // ... }
登录后复制

自定义 waitgroup

另一种方式是使用自定义的 waitgroup 结构体,它封装了 channel 和计数器。

type CustomWaitGroup struct {     ch  chan int     num int }  func NewCustomWaitGroup(num int) *CustomWaitGroup {     return &CustomWaitGroup{         ch:  make(chan int, num),         num: num,     } }  func (r *CustomWaitGroup) Done() {     r.ch <- 1 }  func (r *CustomWaitGroup) Wait() {     for i := 0; i < r.num; i++ {         <-r.ch     } }
登录后复制

以上就是Go 协程如何实现等待多个协程完成?的详细内容,更多请关注php中文网其它相关文章!

本文来自网络,不代表甲倪知识立场,转载请注明出处:http://www.spjiani.cn/wp/4794.html

作者: nijia

发表评论

您的电子邮箱地址不会被公开。

联系我们

联系我们

0898-88881688

在线咨询: QQ交谈

邮箱: email@wangzhan.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部