上一篇我们讲了 go-zero
中的并发工具包 core/syncx
。
从整体分析来看,并发组件主要通过 channel + mutex
控制程序中协程之间沟通。
Do not communicate by sharing memory; instead, share memory by communicating.
不要通过共享内存来通信,而应通过通信来共享内存。
本篇来聊 go-zero
对 Go 中 goroutine
支持的并发组件。
我们回顾一下,go原生支持的 goroutine
控制的工具有哪些?
go func()
开启一个协程sync.WaitGroup
控制多个协程任务编排sync.Cond
协程唤醒或者是协程等待
那可能会问 go-zero
为什么还要拿出来讲这些?回到 go-zero
的设计理念:工具大于约定和文档。
那么就来看看,go-zero
提供哪些工具?
threading
虽然 go func()
已经很方便,但是有几个问题:
- 如果协程异常退出,无法追踪异常栈
- 某个异常请求触发panic,应该做故障隔离,而不是整个进程退出,容易被攻击
我们看看 core/threading