为什么后端爱用 Go:goroutine 与 channel 并发入门
【摘要】 Go 在后端圈火起来,很大程度靠"并发写起来便宜"。聊聊 goroutine 怎么做到轻量、channel 怎么代替锁来做通信,以及一个用 WaitGroup 等所有任务结束的最小可跑例子。
一、goroutine:一个 go 就开了个"轻线程"
传统线程开几千个就够呛,Go 的 goroutine 由运行时调度,开销极小,开几十万都不稀奇。用法也简单,加个 go 就行:
go func() {
fmt.Println("我在另一个 goroutine 里跑")
}()
这对后端太友好了——每个请求起一个 goroutine 处理,模型清晰,不用自己管线程池。
二、channel:别用锁,用"传数据"通信
多个 goroutine 要共享结果,新手会想加锁。Go 的哲学是"不要通过共享内存来通信,而要通过通信来共享内存"——也就是用 channel 来传递数据:
ch := make(chan string, 3)
go func() { ch <- "任务A完成" }()
go func() { ch <- "任务B完成" }()
fmt.Println(<-ch, <-ch) // 从通道取结果
通道本身就保证了同步安全,比手写锁省心,也不容易写出死锁。
三、等所有任务结束:WaitGroup
实际场景常是"派一堆活,全部干完再汇总"。用 sync.WaitGroup:
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
doWork(id) // 并发干 5 件活
}(i)
}
wg.Wait() // 阻塞,等 5 件全完成
fmt.Println("全部搞定")
四、适合什么、不适合什么
| 场景 | 评价 |
|---|---|
| 高并发网络服务 | Go 的主场,goroutine 模型天然契合 |
| CPU 密集计算 | 不如专门的语言/库,goroutine 不加速计算 |
| 简单脚本 | 有点杀鸡用牛刀 |
小结
Go 的并发之所以好上手,是因为它把"开协程"和"传消息"都做成了语言级的一等公民:go 关键字和 channel 几乎零门槛。后端服务天生要扛大量并发连接,这套模型正好对上。入门记住三点就够了——go 开协程、channel 传数据、WaitGroup 等收尾。剩下的是在具体业务里慢慢体会"什么时候该用 channel、什么时候其实单线程更清楚"。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)