在Go语言中,可以使用goroutine和channel来实现协程池。下面是一个简单的示例代码,演示了如何在Go中实现协程池: ```go package main import ( "fmt" "sync" ) func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { fmt.Println("Worker", id, "started job", j) // 模拟耗时操作 // 这里可以替换为实际的任务处理逻辑 for i := 0; i < 100000000; i++ { // Do nothing } fmt.Println("Worker", id, "finished job", j) results <- j * 2 } } funcmain() { const numJobs = 10 const numWorkers = 3 jobs := make(chan int, numJobs) results := make(chan int, numJobs) // 创建等待组,用于等待所有协程执行完毕 var wg sync.WaitGroup wg.Add(numWorkers) // 启动多个协程作为工作池 for i := 1; i <= numWorkers; i++ { go func(id int) { defer wg.Done() worker(id, jobs, results) }(i) } // 提交任务到工作池 for j := 1; j <= numJobs; j++ { jobs <- j } close(jobs) // 等待所有协程执行完毕 wg.Wait() // 关闭结果通道,确保所有结果被消费完毕 close(results) } ``` 在这个例子中,我们创建了一个协程池,由`numWorkers`个协程组成。这些协程不断地从`jobs`通道中获取任务,并把结果发送到`results`通道。任务的数量由`numJobs`定义。在主函数中,我们首先创建了两个通道`jobs`和`results`,分别用于接收任务和接收结果。然后,我们使用`sync.WaitGroup`来等待所有的协程执行完毕。在启动协程之前,我们使用匿名函数将每个协程的ID作为参数传递给`worker`函数。这样每个协程都有自己的ID,可以在输出中显示。接下来,我们通过循环将任务发送到`jobs`通道中。我们使用`WaitGroup`等待所有的协程执行完毕,并关闭结果通道。 [2023-11-09 18:17:00 | AI写代码神器 | 550点数解答]