ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

cc-skills-golang 并发技能实战:goroutine、channel、worker池与context取消的完整实现

cc-skills-golang 并发技能实战:goroutine、channel、worker池与context取消的完整实现 cc-skills-golang 并发技能实战goroutine、channel、worker池与context取消的完整实现【免费下载链接】cc-skills-golang‍ A collection of Golang agentic skills that works项目地址: https://gitcode.com/gh_mirrors/cc/cc-skills-golangcc-skills-golang 是一个面向 Go 项目的 Agent 技能集其中的golang-concurrency并发技能把goroutine 生命周期管理、channel 通信、worker 池errgroup、context 取消传播等 Go 并发编程的最佳实践沉淀成一套可直接执行的标准。装上它AI 编码助手写出的并发代码不再泄露 goroutine、不再死锁。本文带你用这套技能完整走一遍并发实现的关键路径。 为什么需要并发技能并发代码的 bug 往往在上线后才爆发goroutine 泄露、channel 死锁、竞态条件……项目评估数据显示加载并发技能后相关代码的通过率从61% 提升到 100%见 EVALUATIONS.md相当于错误率下降 39%。安装只需一行npx skills add https://github.com/samber/cc-skills-golang --skill golang-concurrency技能的入口文档是 skills/golang-concurrency/SKILL.md它会按需加载下面三篇深度参考文档通道与 select 模式skills/golang-concurrency/references/channels-and-select.md管道与 worker 池skills/golang-concurrency/references/pipelines.md同步原语详解skills/golang-concurrency/references/sync-primitives.md 核心原则每个 goroutine 都要能下班技能的开场人设非常直白假设每一个 goroutine 都是负债直到证明它是必要的。其九大核心原则中最关键的一条是——每个 goroutine 必须有清晰的退出机制context、done 通道或 WaitGroup否则它会一直泄露累积直到进程崩溃。启动 goroutine 前的自检清单来自 SKILL.md它如何退出—— context 取消、channel 关闭或显式信号我能通知它停止吗—— 传入context.Context或 done 通道我能等待它结束吗——sync.WaitGroup或errgroupchannel 归谁所有—— 创建者/发送方拥有并负责关闭它真的需要同步吗—— 没有测量依据就不要加并发 channel 使用三法则方向、关闭、缓冲通道是 Go 并发编程的灵魂技能文档给出了三条铁律法则要点反例后果声明方向函数签名用chan-只发、-chan只收调用方误关/误发发送方关闭只有发送者能close(ch)接收方关闭会导致 panic进程直接崩溃默认无缓冲大缓冲会掩盖背压问题N1 必须写明理由缓冲写满后行为不可预测缓冲大小的推荐选择0无缓冲默认同步交接、1信号通道如done : make(chan struct{}, 1)、N1仅在有测量依据时使用。还有一个高频陷阱避免在热循环里反复time.After——每次调用都会分配新定时器。正确做法是循环外创建time.NewTimer循环内Stop()Reset()复用详见 channels-and-select.md。⚙️ worker 池优先 errgroup.SetLimit少写轮子很多新手会手写信号量 WaitGroup实现 worker 池但技能的建议是大多数场景用errgroup就够了。需求选择理由等 goroutine 结束无需错误sync.WaitGroup发射后不管等待 收集首个错误errgroup.Group错误传播首个错误时取消兄弟任务errgroup.WithContextcontext 自动取消等待 限制并发数errgroup.SetLimit(n)内置 worker 池errgroup.SetLimit(10)一行就实现了最多 10 个并发 worker直接替代手写的有界 worker 池。只有当你需要 per-worker 状态、自定义背压或优雅排空时才考虑手写实现参考 pipelines.md 中的 semaphore 版本。 context 取消给整个并发系统装上总开关context 技能skills/golang-context/SKILL.md与并发技能是黄金搭档核心规则同一个 context 贯穿整条调用链——HTTP handler → service → DB → 外部 API任何一环context.Background()都会断路导致上游取消失效ctx永远是第一个参数——这是 linter 能识别、开发者一眼可读的固定约定defer cancel()必须调用——WithCancel/WithTimeout都会创建取消状态和定时器资源不调用cancel()就会泄露嵌套超时取更短者——父 context 5 秒超时子 context 写 10 秒也照样 5 秒到期监听取消的标准写法是把ctx.Done()放进selectfor { select { case -ctx.Done(): return ctx.Err() // context.Canceled 或 DeadlineExceeded case -ticker.C: doWork(ctx) } }还有一个新手容易忽略的点wg.Add(1)必须在go之前调用写在 goroutine 内部会导致Wait()提前返回详见 sync-primitives.md。 fan-out / fan-in 管道并发处理的骨架管道pipeline是多个阶段通过 channel 串联生成 → 处理 → 汇聚。技能给出的 fan-out 模式是 N 个 worker 从同一输入通道并行消费任务fan-in 则把多个输出通道合并为一个——合并的关闭时机由wg.Wait()之后统一close(out)保证绝不会出现通道没关、下游 range 卡死的问题。管道四条硬规则每个阶段都必须 select 监听ctx.Done()防止提前取消时 goroutine 泄露每级生产者负责关闭自己的输出通道defer close(out)绝不在阶段中无限创建 goroutine无 I/O 的纯 CPU 数据转换Go 1.23 可改用迭代器range-over-func零 goroutine 开销✅ 并发代码上线前检查清单技能内置的常见错误表可以直接当 review 清单用错误修复发射后不管的 goroutine提供停止机制context / done 通道接收方关闭 channel只有发送方关闭热循环里time.After复用time.NewTimerResetselect 缺少ctx.Done()永远 select context 以允许取消无限创建 goroutineerrgroup.SetLimit(n)或信号量channel 里传指针传副本或不可变值wg.Add写在 goroutine 内在go之前调用AddCI 忘了-race永远跑go test -race ./...配套工具链测试用go.uber.org/goleak拦截泄露生产用runtime.NumGoroutine()监控数量/debug/pprof/goroutine?debug2导出堆栈——Go 1.27 起甚至内置了 goroutine 泄露 profile。 写在最后这套并发技能的精髓是把结构化并发变成肌肉记忆每个 goroutine 有主人、有出口、有错误传播。结合 skills/golang-context/references/cancellation.md 的取消传播模式和 skills/golang-concurrency/evals/evals.json 中 62 条评测断言你既能让 AI 助手写出教科书级的并发代码也能用它给存量代码做一次完整的并发审计。【免费下载链接】cc-skills-golang‍ A collection of Golang agentic skills that works项目地址: https://gitcode.com/gh_mirrors/cc/cc-skills-golang创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表