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运行时进行的。
通过本文的介绍和示例代码,相信你对如何使用Golang的WaitGroup实现任务调度器有了更深的理解。希望本文对你学习和使用Golang的并发编程有所帮助!
以上就是Golang并发编程:使用Go WaitGroup实现任务调度器的详细内容,更多请关注php中文网其它相关文章!
已抢66247个
抢已抢35546个
抢已抢19778个
抢