Golang开发:手把手教你用代码实现协程池
在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`等待所有的协程执行完毕,并关闭结果通道。 ######[AI写代码神器 | 550点数解答 | 2023-11-09 18:17:00]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)352
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)323
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)477
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)363
- 深度剖析:Go语言中 make 与 new 函数的区别(百度文心 | 346点数解答 | 2023-11-09 18:10:41)371
- Golang开发必知:数组与切片的五大区别及适用场景(百度文心 | 270点数解答 | 2023-11-09 18:10:41)263
- Golang开发必知:单引号、双引号与反引号在字符串表示上的区别(百度文心 | 214点数解答 | 2023-11-09 18:10:50)287
- Golang开发:调用函数传入结构体,传值还是指针?一文说清!(百度文心 | 478点数解答 | 2023-11-09 18:12:10)241
- Golang开发必备:sync.Map用法全解析与示例展示(百度文心 | 408点数解答 | 2023-11-09 18:12:12)260
- Golang开发必看:用反射机制实现结构体标签解析示例及性能提醒(百度文心 | 456点数解答 | 2023-11-09 18:12:12)268
- Go语言map使用全解析:初始化、并发安全及内存管理要点(百度文心 | 396点数解答 | 2023-11-09 18:14:06)242
- Go语言 uint 类型溢出问题全解析:原因、示例与避免方法(百度文心 | 539点数解答 | 2023-11-09 18:14:06)293