在Go语言中,启动一个goroutine(即轻量级的线程)非常简单,只需在函数调用前加上go
关键字即可。然而,如果你想等待一个或多个goroutine执行完成,你通常需要使用某种同步机制,如sync.WaitGroup
、通道(channel)或互斥锁(mutex)结合条件变量(condition variable)。
下面是一个使用sync.WaitGroup
等待goroutine执行完成的示例:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done() // 在goroutine结束时调用Done来通知WaitGroup
fmt.Printf("Worker %d starting\n", id)
time.Sleep(time.Second * 2) // 模拟工作
fmt.Printf("Worker %d done\n", id)
}
func main() {
var wg sync.WaitGroup
// 启动3个goroutine
for i := 1; i <= 3; i++ {
wg.Add(1) // 为每个goroutine增加WaitGroup的计数器
go worker(i, &wg) // 启动goroutine
}
// 等待所有goroutine执行完成
wg.Wait()
fmt.Println("All workers have finished")
}
在这个例子中,我们定义了一个worker
函数,它接收一个ID和一个指向sync.WaitGroup
的指针。在main
函数中,我们创建了一个sync.WaitGroup
实例,并使用一个for循环启动了3个goroutine。对于每个goroutine,我们都调用wg.Add(1)
来增加WaitGroup的计数器。在goroutine内部,我们使用defer wg.Done()
来确保在goroutine结束时调用Done
方法,这将减少WaitGroup的计数器。最后,在main
函数中,我们调用wg.Wait()
来阻塞,直到所有goroutine都调用了Done
方法,即所有goroutine都执行完成。
Was this helpful?
0 / 0