Go主协程如何等其余协程完再操作

news/2025/1/1 14:59:16/

在Go语言中,主协程(main goroutine)可以使用多种方式来等待其他协程完成其操作。常见的方法是使用通道(channels)和 sync 包中的工具,比如 sync.WaitGroup。以下是这两种方法的示例:

使用 sync.WaitGroup

sync.WaitGroup 是一个非常方便的工具,用于等待一组协程完成。你可以通过调用 Add 方法来设置要等待的协程数量,并在每个协程完成时调用 Done 方法。最后,使用 Wait 方法来阻塞主协程,直到所有协程都完成。

package mainimport ("fmt""sync""time"
)func worker(id int, wg *sync.WaitGroup) {defer wg.Done() // 确保在函数退出时调用 Donefmt.Printf("Worker %d starting\n", id)time.Sleep(time.Second) // 模拟一些工作fmt.Printf("Worker %d done\n", id)
}func main() {var wg sync.WaitGroupfor i := 1; i <= 5; i++ {wg.Add(1) // 增加等待计数go worker(i, &wg)}wg.Wait() // 等待所有协程完成fmt.Println("All workers done.")
}

使用通道(Channels)

另一种方法是使用无缓冲通道。主协程可以创建一个无缓冲通道,并在启动所有协程后将该通道传递给它们。每个协程在完成任务后将一个值发送到该通道。主协程则通过读取通道中的值来等待所有协程完成。

package mainimport ("fmt""time"
)func worker(id int, done chan<- struct{}) {fmt.Printf("Worker %d starting\n", id)time.Sleep(time.Second) // 模拟一些工作fmt.Printf("Worker %d done\n", id)done <- struct{}{} // 发送完成信号
}func main() {const numWorkers = 5done := make(chan struct{}, 0) // 无缓冲通道for i := 1; i <= numWorkers; i++ {go worker(i, done)}// 等待所有协程完成for i := 1; i <= numWorkers; i++ {<-done}fmt.Println("All workers done.")
}

总结

  • sync.WaitGroup 是一种更简单和直观的方法来等待多个协程完成。
  • 通道 提供了更灵活的同步机制,但在这种情况下,代码可能会稍微复杂一些。

根据具体需求选择适合的方法,通常 sync.WaitGroup 是更常用的选择,因为它更加简洁和高效。


http://www.ppmy.cn/news/1558995.html

相关文章

Dockerfile运行指令

1.RUN 在build构建时执行命令。 举例&#xff1a;安装vim Shell命令格式 RUN yum install -y vim Exec命令格式 RUN ["yum","install","-y","vim"] 2.CMD 用于设置容器启动时默认执行的命令或参数。 如果Dockerfile中有多个CMD&a…

简单园区网拓扑实验

1.实验拓扑 2.实验要求 1、按照图示的VLAN及IP地址需求&#xff0c;完成相关配置 2、要求SW1为VLAN 2/3的主根及主网关 SW2为vlan 20/30的主根及主网关 SW1和SW2互为备份 3、可以使用super vlan 4、上层通过静态路由协议完成数据通信过程 5、AR1为企业出口路由器 6、要求全网可…

Zookeeper下面的conf目录下面的zoo.cfg

zoo.cfg 是 ZooKeeper 安装目录下 conf 目录中的一个核心配置文件。这个文件包含了启动和运行 ZooKeeper 服务所需的所有配置信息。 zoo.cfg 文件中的内容通常包括以下部分&#xff1a; tickTime&#xff1a;这是 ZooKeeper 中最小的时间单位&#xff08;以毫秒为单位&#xf…

微信流量主挑战:用户破16!新增文档转换(新纪元3)

朋友们&#xff0c;报告好消息&#xff01;我的小程序用户数量已经涨到16个了&#xff01;没错&#xff0c;真没拉朋友圈亲戚好友来撑场子&#xff0c;全靠实力&#xff08;和一点点运气&#xff09;吸引了16位陌生小伙伴光临&#xff01;这波进步&#xff0c;连我自己都感动了…

利用 deepin-IDE 的 AI 能力,我实现了文件加密扩展

经过多轮迭代&#xff0c;deepin 文件管理器&#xff08;dde-file-manager&#xff09;的扩展功能已经趋于稳定&#xff0c;看到越来越丰富的文管新功能&#xff0c;作为一名技术爱好者&#xff0c;也想自己动手写个插件扩展一下文管的功能。 我选择的开发工具是 deepin-IDE&a…

Word表格另起一页解决办法

Word表格另起一页解决办法 表格设置根据内容自动调整&#xff0c;取消指定高度第1步 第2步

socket编程(C++/Windows)

相关文章推荐&#xff1a; Socket 编程基础 面试官&#xff0c;不要再问我三次握手和四次挥手 TCP的三次握手与四次挥手 参考视频&#xff1a; https://www.bilibili.com/video/BV1aW4y1w7Ui/?spm_id_from333.337.search-card.all.click TCP通信流程 服务端 #include<…

【vue】圆环呼吸灯闪烁效果(模拟扭蛋机出口处灯光)

效果图先发&#xff1a; 页面部分&#xff1a; <div ref"round" class"round"><div class"light" ref"light"/><div class"box"></div></div>js部分(控制圆环生成&#xff09;; setRound…