编写go语言协程池遇到的问题
初学go语言,尝试使用go协程池完成一项高并发任务。代码中有一个协程每隔0.00125秒向任务队列中添加一个任务(理论上每秒能向工作队列添加800个协程),每隔任务执行的时间为0.22秒。协程池中协程的数量为400,理论上协程池1秒能够完成800个任务(1/0.00125),然而实际执行10秒后发现仅有700个任务被执行,理论上10秒应该有8000个任务被协程池执行。为此我打印了所有被添加的任务id,发现10秒内仅仅添加了700个任务。为此我取消了添加任务的时间间隔(注释了time.Sleep(1250 * time.Microsecond)这行代码),此时发现10秒内共向任务队列添加了27000个任务,同时协程池在10秒内共完成了17000个任务,比较接近理论数值,这是什么原因导致的呢?
package main import ( "fmt" "sync" "time" ) type Task interface { Execute() } type PrintTask struct { taskID int message string } func (p PrintTask) Execute() { fmt.Printf("Task %d: %s\n", p.taskID, p.message) time.Sleep(220 * time.Millisecond) } func worker(id int, jobs <-chan Task, wg *sync.WaitGroup) { defer wg.Done() for task := range jobs { fmt.Println("worker", id, "started job") task.Execute() // 异步执行任务 // go task.Execute() // 异步执行任务 } } func main() { jobs := make(chan Task, 10000) var wgWorkers sync.WaitGroup // 启动400个工作协程 for w := 1; w <= 400; w++ { wgWorkers.Add(1) go worker(w, jobs, &wgWorkers) } // 异步添加任务 go func() { taskID := 0 for { select { case jobs <- PrintTask{taskID, "Hello, World!"}: taskID++ fmt.Println("添加的任务id是",taskID) // time.Sleep(1250 * time.Microsecond) default: // 当任务队列已满时,等待一段时间再尝试添加任务 time.Sleep(100 * time.Millisecond) fmt.Println("工作队列已满") } } }() // 模拟运行一段时间后停止添加任务 time.Sleep(10 * time.Second) close(jobs) // 关闭任务队列 wgWorkers.Wait() // 等待所有工作协程完成 }#golang基础##悬赏#