package main
import (
"fmt"
"sync"
)
func worker(id int, taskQueue <-chan int, wg *sync.WaitGroup) {
defer wg.Done()
for task := range taskQueue {
fmt.Printf("Worker %d is processing task %d\n", id, task)
}
}
func main() {
const numWorkers = 3
var wg sync.WaitGroup
taskQueue := make(chan int)
for i := 0; i < numWorkers; i++ {
wg.Add(1)
go worker(i, taskQueue, &wg)
}
for i := 1; i <= 10; i++ {
taskQueue <- i
}
close(taskQueue)
wg.Wait()
}
控制结构对性能的影响
for... range
循环:在 worker
函数中,for task := range taskQueue
这种形式会不断从 taskQueue
通道中接收数据,直到通道关闭。这保证了所有的任务都被处理,同时在通道为空时,worker
会阻塞等待新任务,避免了不必要的CPU空转,从而提高了性能。
select
语句(虽然本题代码中未直接使用,但类似场景会涉及):在更复杂的并发场景中,select
语句可以同时监听多个通道的操作(接收或发送)。例如,除了任务通道,可能还有一个控制通道用于发送停止信号。select
语句会阻塞直到其中一个通道操作准备就绪。如果多个通道同时准备好,会随机选择一个执行。这种机制使得 goroutine
可以高效地处理多个异步事件,避免在等待单一通道时浪费CPU资源,提高了并发程序的整体性能。在有多个 goroutine
竞争任务的场景下,select
语句结合通道可以实现公平且高效的任务分配。