网络语言系列&go系列【仅供参考】:Go主协程如何等其余协程完再操作




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

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

使用 sync.WaitGroup

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

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

使用通道(Channels)

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

package main
 
import (
	"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 = 5
	done := 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 是更常用的选择,因为它更加简洁和高效。







ac-er8888

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坦笑&&life

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值