序
本文次要钻研一下gost的GoUnterminated
GoUnterminated
gost/runtime/goroutine.go
// GoUnterminated is used for which goroutine wanna long live as its process.// @period: sleep time duration after panic to defeat @handle panic so frequently. if it is not positive,// the @handle will be invoked asap after panic.func GoUnterminated(handle func(), wg *sync.WaitGroup, ignoreRecover bool, period time.Duration) { GoSafely(wg, ignoreRecover, handle, func(r interface{}) { if period > 0 { time.Sleep(period) } GoUnterminated(handle, wg, ignoreRecover, period) }, )}
GoUnterminated办法提供handle、WaitGroup、ignoreRecover、period参数,其外部应用的是GoSafely,只是catchFunc是内置的;catchFunc对于period大于0的会sleep一下,之后还是执行GoUnterminated,这样子在handle出错(panic
)的时候会始终递归循环上来
实例
gost/runtime/goroutine_test.go
func TestGoUnterminated(t *testing.T) { times := uint64(1) var wg sync.WaitGroup GoUnterminated( func() { if atomic.AddUint64(×, 1) == 2 { panic("hello") } }, &wg, false, 1e8, ) wg.Wait() assert.True(t, atomic.LoadUint64(×) == 3) GoUnterminated(func() { atomic.AddUint64(×, 1) }, nil, false, 1e8, ) time.Sleep(1e9) assert.True(t, atomic.LoadUint64(×) == 4)}
这里模仿了一下handler在times为1的时候产生panic,以及handler不产生panic就立即完结的场景
小结
gost提供了GoSafely办法,该办法提供handle、WaitGroup、ignoreRecover、period参数,其外部应用的是GoSafely,只是catchFunc是内置的;catchFunc对于period大于0的会sleep一下,之后还是执行GoUnterminated,这样子在handle出错(panic
)的时候会始终递归循环上来。
doc
- gost