Go语言(Golang)超时机制
機(jī)制1:select+time.After
通過select+time.After方法實(shí)現(xiàn)超時(shí)機(jī)制,示例代碼如下:
package mainimport ("context""fmt""runtime""time" )func main() {timeout1()println("Goroutine數(shù)量:",runtime.NumGoroutine())time.Sleep(time.Second*10)println("Goroutine數(shù)量:",runtime.NumGoroutine()) }func timeout1() {//通過select+time.After方法實(shí)現(xiàn)超時(shí)機(jī)制ch := make(chan struct{}, 1)go func() {//具體業(yè)務(wù)邏輯time.Sleep(time.Second*3)ch <- struct{}{}}()select {case <-ch:fmt.Println("業(yè)務(wù)邏輯執(zhí)行完成!")case <-time.After(time.Second * 2):fmt.Println("超時(shí)...")}return }運(yùn)行效果
分析:上述代碼,超時(shí)時(shí)間到,執(zhí)行case <-time.After(time.Second * 2),timeout1()函數(shù)退出。而
Goroutine需要等到時(shí)間到了,執(zhí)行ch <- struct{}{}之后才能結(jié)束。因此在main中輸出的Goroutine分別為2(包括一個(gè)主線程)、1。
特別注意:如果將
ch := make(chan struct{}, 1)改為:
ch := make(chan struct{})若發(fā)生超時(shí),由于timeout1()函數(shù)退出已經(jīng)退出,Goroutine中的ch將一直無法寫入數(shù)據(jù),因此該Goroutine將一直無法退出(內(nèi)存泄露,有的時(shí)候也說成Goroutine泄露)。
上述代碼中寫入channel的數(shù)據(jù)為:struct{},主要作用是為了節(jié)省內(nèi)存。
func main() {testSize() }func testSize() {a := 1b := truec := "1"d := struct{}{}sizeofa := unsafe.Sizeof(a)sizeofb := unsafe.Sizeof(b)sizeofc := unsafe.Sizeof(c)sizeofd := unsafe.Sizeof(d)fmt.Println(sizeofa, sizeofb, sizeofc, sizeofd) }?即:struct{} 大小為0.
?機(jī)制2:select+context
通過select+context方法實(shí)現(xiàn)超時(shí)機(jī)制,示例代碼如下:
package mainimport ("context""fmt""runtime""time" )func main() {timeout2(context.Background())println("Goroutine數(shù)量:",runtime.NumGoroutine())time.Sleep(time.Second*10)println("Goroutine數(shù)量:",runtime.NumGoroutine()) }func timeout2(ctx context.Context) {c, cancelFunc := context.WithTimeout(ctx, time.Second*5)go func() {//具體業(yè)務(wù)邏輯time.Sleep(time.Second*6)defer cancelFunc() //業(yè)務(wù)邏輯執(zhí)行完之后,直接調(diào)用context結(jié)束}()select {//如果時(shí)間到,變量c(類型為:context)會(huì)自動(dòng)調(diào)用。如果業(yè)務(wù)執(zhí)行完成,cancelFunc()也會(huì)調(diào)用case <-c.Done():fmt.Println("執(zhí)行結(jié)束")}return }運(yùn)行效果
代碼分析:與機(jī)制1的相似,業(yè)務(wù)超時(shí)完成時(shí),timeout2已經(jīng)退出,此時(shí)該Goroutine才退出。
總結(jié)
以上是生活随笔為你收集整理的Go语言(Golang)超时机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二十年后的世界和我
- 下一篇: access数据库修复