0

0

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

聖光之護

聖光之護

发布时间:2024-11-10 15:57:10

|

825人浏览过

|

来源于php中文网

原创

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

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

为了实现主协程等待多个子协程执行完毕的效果,类似于 sync.waitgroup,可以使用 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

情感家园企业站5.0 多语言多风格版
情感家园企业站5.0 多语言多风格版

一套面向小企业用户的企业网站程序!功能简单,操作简单。实现了小企业网站的很多实用的功能,如文章新闻模块、图片展示、产品列表以及小型的下载功能,还同时增加了邮件订阅等相应模块。公告,友情链接等这些通用功能本程序也同样都集成了!同时本程序引入了模块功能,只要在系统默认模板上创建模块,可以在任何一个语言环境(或任意风格)的适当位置进行使用!

下载

也可以使用 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
    }
}

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

197

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

190

2025.07.04

Golang channel原理
Golang channel原理

本专题整合了Golang channel通信相关介绍,阅读专题下面的文章了解更多详细内容。

247

2025.11.14

golang channel相关教程
golang channel相关教程

本专题整合了golang处理channel相关教程,阅读专题下面的文章了解更多详细内容。

342

2025.11.17

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

11

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

4

2026.01.21

无人机驾驶证报考 uom民用无人机综合管理平台官网
无人机驾驶证报考 uom民用无人机综合管理平台官网

无人机驾驶证(CAAC执照)报考需年满16周岁,初中以上学历,身体健康(矫正视力1.0以上,无严重疾病),且无犯罪记录。个人需通过民航局授权的训练机构报名,经理论(法规、原理)、模拟飞行、实操(GPS/姿态模式)及地面站训练后考试合格,通常15-25天拿证。

16

2026.01.21

Python多线程合集
Python多线程合集

本专题整合了Python多线程相关教程,阅读专题下面的文章了解更多详细内容。

1

2026.01.21

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号