Go协程这样用才安全.docx
《Go协程这样用才安全.docx》由会员分享,可在线阅读,更多相关《Go协程这样用才安全.docx(5页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Go协程这样用才安全Go协程有一个不小的问题你无法在父协程中捕获子协程的panic。比方下面的例子: func main() / 祈望捕获所有所有 panic defer func() r := recover() fmt.Println(r) () / 启动新协程 go func() panic(123) () / 等待一下,不然协程可能来不及执行 time.Sleep(1 * time.Second) fmt.Println( 这条消息打印不出来 )自己执行一下就会发现,最后的fmt.Println没有执行,也就是讲开场的recover()没有捕获协程中的panic,整个进程都退出了。 一
2、般的Go框架都是针对每一个恳求启一个新协程,并统一捕获所有的panic。 假如程序员在写业务代码的时候开了新协程而且忘记了在协程中捕获panic的话,效劳的进程就会因为某个未捕获的panic而退出。所以,我在一文中建议*少用或不用协程*。 少用或者不用协程对于大多数业务场景是没有问题。但有些少数场景还是要用协程的。 比方讲我司有一个批量查询接口,一次最多支持查50条信息。但我们的业务要求一次要查100到1000条信息不等。假如不使用协程,需要依次执行2到10次查询,可能就超时了。 不用协程会超时,用协程可能会panic,怎么办呢?最好的方法就是引入框架方法,把Go的协程包装一下。 我们首先定义
3、一个构造体 / Panic 子协程 panic 会被重新包装,添加调用栈信息type Panic struct R interface / recover() 返回值 Stack byte / 当时的调用栈func (p Panic) String() string return fmt.Sprintf( %vn%s , p.R, p.Stack)type PanicGroup struct panics chan Panic / 协程 panic 通知信道 dones chan int / 协程完成通知信道 jobN int32 / 协程并发数量因为Go的channel无法直接初始化,所以需
4、要定义一个工厂方法 func NewPanicGroup() *PanicGroup return PanicGroup panics: make(chan Panic, 8), dones: make(chan int, 8), 针对PanicGroup我们定义Go以及Wait两个方法。 Go方法用来启动新的协程,定义如下: func (g *PanicGroup) Go(f func() *PanicGroup atomic.AddInt32( g.jobN, 1) go func() defer func() if r := recover(); r != nil g.panics -
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Go 这样 安全
限制150内