
Golang并发编程:使用Go WaitGroup实现任务调度器
WaitGroup内部维护了一个计数器,用来记录未完成的任务数量。当调用Add方法时,计数器加上指定的值;当调用Done方法时,计数器减1;当调用Wait方法时,如果计数器大于0,当前goroutine会被阻塞,直到计数器归零。
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Printf("Worker %d starting
", id)
time.Sleep(time.Second)
fmt.Printf("Worker %d done
", 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")
}在这个示例中,我们使用一个for循环启动5个worker goroutine,并通过调用wg.Add(1)来将任务数量添加到WaitGroup中。在worker函数中,使用defer关键字来确保在函数返回前调用wg.Done(),来减少计数器的值。最后,使用wg.Wait()来等待所有任务完成。
Worker 1 starting Worker 2 starting Worker 3 starting Worker 4 starting Worker 5 starting Worker 3 done Worker 1 done Worker 2 done Worker 5 done Worker 4 done All workers done
可以看到,所有的worker goroutine被并发执行,但是输出的顺序并不一定是按照启动顺序来的,这是因为goroutine的调度是由Go运行时进行的。
立即学习“go语言免费学习笔记(深入)”;
通过本文的介绍和示例代码,相信你对如何使用Golang的WaitGroup实现任务调度器有了更深的理解。希望本文对你学习和使用Golang的并发编程有所帮助!
以上就是Golang并发编程:使用Go WaitGroup实现任务调度器的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号