自学内容网 自学内容网

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 是更常用的选择,因为它更加简洁和高效。


原文地址:https://blog.csdn.net/sheji888/article/details/144757161

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!