Go 语言协程泄露全解析:成因、示例与 `sync.WaitGroup` 解决方案
在Go语言中,协程(goroutine)是一种轻量级的线程,可以并发执行任务。如果在使用协程的过程中出现了协程泄露(goroutine leak),可能会导致程序中的资源无法得到正确的回收,从而影响程序的性能和稳定性。 协程泄露(goroutine leak)是指程序中存在未关闭的协程,这些协程占用了系统资源(如内存和CPU时间片),但不再被需要或不再被执行。这通常发生在程序中创建了协程但未正确关闭或管理的情况下。 例如,以下是一个简单的示例代码,其中存在协程泄露: ```go package main import ( "fmt" "time" ) func main() { go startGoroutine() // 启动一个协程 // 主协程执行其他任务 for i := 0; i < 10; i++ { fmt.Println("Main goroutine executing...") time.Sleep(1 * time.Second) } } func startGoroutine() { // 子协程执行任务 for i := 0; i < 5; i++ { fmt.Println("Goroutine executing...") time.Sleep(1 * time.Second) } } ``` 在上面的代码中,主协程启动了一个子协程来执行任务,但主协程没有等待子协程执行完毕就继续执行其他任务。子协程在执行完任务后仍然继续存在,但主协程并没有关闭它,导致协程泄露。 为了避免协程泄露,可以使用Go语言提供的`sync.WaitGroup`来等待所有协程执行完毕后再关闭它们。例如,在上面的示例中,可以修改代码如下: ```go package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup wg.Add(1) // 增加一个等待的协程数 go startGoroutine() // 启动一个协程 // 主协程执行其他任务 for i := 0; i < 10; i++ { fmt.Println("Main goroutine executing...") time.Sleep(1 * time.Second) } wg.Wait() // 等待所有协程执行完毕后再继续执行下一个任务 } func startGoroutine() { defer wg.Done() // 在子协程执行完毕后减少等待的协程数 // 子协程执行任务... } ``` 通过使用`sync.WaitGroup`,可以确保主程序在所有协程执行完毕后再继续执行下一个任务,从而避免了协程泄露的问题。 ######[AI写代码神器 | 600点数解答 | 2023-11-09 18:14:11]
- Python 实现句子反转:单词大小写转换与数字倒转(字节豆包 | 131点数解答 | 2024-11-11 16:44:49)421
- Python 实现句子单词逆序及大小写、数字转换,开发要点揭秘!(百度文心 | 451点数解答 | 2025-10-25 11:33:27)86
- C语言实现:句子反转,单词大小写与数字倒转处理(百度文心 | 1010点数解答 | 2025-10-25 11:34:26)115
- C语言实现句子反转:处理输入空格、内存管理与数字判断的要点(阿里通义 | 712点数解答 | 2025-10-25 11:35:19)90
- C++实现机关门数字判断程序,依据3的倍数规则输出结果(字节豆包 | 167点数解答 | 2026-03-14 20:35:32)28
- C++实现机关门数字判断程序,依据3的倍数决定操作(字节豆包 | 132点数解答 | 2026-03-14 20:36:37)22
- 导出功能优化:解决多次导出、过程异常、失败提示及完成通知问题 (DeepSeek | 1点数解答 | 2025-02-12 17:35:54)192
- C 语言实现句子反转:单词大小写转换与数字倒转(字节豆包 | 393点数解答 | 2024-11-11 16:45:21)550
- Java实现链表反转:迭代与递归双解法详解及开发实战指南(DeepSeek | 1409点数解答 | 2026-03-15 15:09:29)35
- SQL:[pr_createdtables]存储过程代码解析及表创建准备 (字节豆包 | 33点数解答 | 2024-08-29 15:34:33)355
- 探寻数组中最长摆动子序列长度:思路剖析与代码优化(GPT | 758点数解答 | 2024-12-23 23:18:29)274
- 独家剖析:求解数组最长摆动子序列长度的代码实现与改进建议(GPT | 350点数解答 | 2024-12-23 23:20:54)271