好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Golang實現超時退出的三種方式

Golang實現超時退出的三種方式

熱門標簽:賺地圖標注的錢犯法嗎 廣東語音外呼系統供應商 福州鐵通自動外呼系統 智能電銷機器人營銷 烏魯木齊人工電銷機器人系統 濮陽自動外呼系統代理 地圖標注測試 長沙ai機器人電銷 澳門防封電銷卡

前段時間發現線上有個服務接口,總是間歇性告警,有時候一天兩三次,有時候一天都沒有。

告警的邏輯是在一個接口中異步調用了另一個HTTP接口,這個HTTP接口調用出現超時。但是我去問了負責這個HTTP接口的同學,人家說他們的接口相應都是毫秒級別,還截圖監控了,有圖有真相,我還能說啥。

但是,超時是確實存在的,只是請求還可能沒有到人家服務那邊。

這種偶發性問題不好復現,偶爾來個告警也挺煩的,第一反應還是先解決問題,思路也簡單,失敗后重試。

解決方法

且不談重試策略,先說說什么時候觸發重試。

我們可以在接口請求出錯拋出err的時候重試,但是這種不好控制,如果一個請求出去,十來秒都沒有響應,則這個協程就要傻傻的等他報錯才能重試,浪費生命啊~

所以結合上面同學給出的毫秒級響應指標,可以設定一個超時時間,如果在指定超時時間后沒有返回結果,則重試(這篇重試不是重點)。

func AsyncCall() {
 ctx, cancel := context.WithTimeout(context.Background(), time.Duration(time.Millisecond*800))
 defer cancel()
 go func(ctx context.Context) {
 // 發送HTTP請求
 }()

 select {
 case -ctx.Done():
 fmt.Println("call successfully!!!")
 return
 case -time.After(time.Duration(time.Millisecond * 900)):
 fmt.Println("timeout!!!")
 return
 }
}

說明

1、通過context的WithTimeout設置一個有效時間為800毫秒的context。

2、該context會在耗盡800毫秒后或者方法執行完成后結束,結束的時候會向通道ctx.Done發送信號。

3、有人可能要問,你這里已經設置了context的有效時間,為什么還要加上這個time.After呢?

這是因為該方法內的context是自己申明的,可以手動設置對應的超時時間,但是在大多數場景,這里的ctx是從上游一直傳遞過來的,對于上游傳遞過來的context還剩多少時間,我們是不知道的,所以這時候通過time.After設置一個自己預期的超時時間就很有必要了。

4、注意,這里要記得調用cancel(),不然即使提前執行完了,還要傻傻等到800毫秒后context才會被釋放。

總結

上面的超時控制是搭配使用了ctx.Done和time.After。

Done通道負責監聽context啥時候完事,如果在time.After設置的超時時間到了,你還沒完事,那我就不等了,執行超時后的邏輯代碼。

舉一反三

那么,除了上面這種超時控制策略,還有其他的套路嗎?

有,但是大同小異。

第一種:使用time.NewTimer

func AsyncCall() {
 ctx, cancel := context.WithTimeout(context.Background(), time.Duration(time.Millisecond * 800))
 defer cancel()
 timer := time.NewTimer(time.Duration(time.Millisecond * 900))

 go func(ctx context.Context) {
 // 發送HTTP請求
 }()

 select {
 case -ctx.Done():
 timer.Stop()
 timer.Reset(time.Second)
 fmt.Println("call successfully!!!")
 return
 case -timer.C:
 fmt.Println("timeout!!!")
 return
 }
}

這里的主要區別是將time.After換成了time.NewTimer,也是同樣的思路如果接口調用提前完成,則監聽到Done信號,然后關閉定時器。

否則的話,會在指定的timer即900毫秒后執行超時后的業務邏輯。

第二種:使用通道

func AsyncCall() {
 ctx := context.Background()
 done := make(chan struct{}, 1)

 go func(ctx context.Context) {
 // 發送HTTP請求
 done - struct{}{}
 }()

 select {
 case -done:
 fmt.Println("call successfully!!!")
 return
 case -time.After(time.Duration(800 * time.Millisecond)):
 fmt.Println("timeout!!!")
 return
 }
}

1、這里主要利用通道可以在協程之間通信的特點,當調用成功后,向done通道發送信號。

2、監聽Done信號,如果在time.After超時時間之前接收到,則正常返回,否則走向time.After的超時邏輯,執行超時邏輯代碼。

3、這里使用的是通道和time.After組合,也可以使用通道和time.NewTimer組合。

總結

本篇主要介紹如何實現超時控制,主要有三種

1、context.WithTimeout/context.WithDeadline + time.After

2、context.WithTimeout/context.WithDeadline + time.NewTimer

3、channel + time.After/time.NewTimer

到此這篇關于Golang三種方式實現超時退出的文章就介紹到這了,更多相關Golang超時退出內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Go語言 go程釋放操作(退出/銷毀)
  • golang 阻止主goroutine退出的操作
  • Golang信號處理及如何實現進程的優雅退出詳解
  • Golang實現for循環運行超時后自動退出的方法
  • 解決go在函數退出后子協程的退出問題

標簽:調研邀請 慶陽 太原 貴陽 阿克蘇 德州 西雙版納 廣西

巨人網絡通訊聲明:本文標題《Golang實現超時退出的三種方式》,本文關鍵詞  Golang,實現,超時,退出,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang實現超時退出的三種方式》相關的同類信息!
  • 本頁收集關于Golang實現超時退出的三種方式的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 肉奴隷 赤坂丽在线播放| 欧美大尺度交性视频| 写真福利第页在线视频| 国产乱子伦在线观看| 欧美极品sex高清videos| 国产精品一线天美女| 欧美三级网站在线观看| 成人综合网| 久久久久久久国产精品| 91啦九色| 外遇(出轨h| 欧美激情精品久久久久久免费印度| 色播在线观看免费| 美女脱个精光扒开尿口胸人桶| 波多野结衣在线视频| 性欧美巨大极品videos| 久久久久久a亚洲欧洲AV冫| 国产精品秘?入口人妻入口图片| bl爽~闷哼~顶弄~深bl| 中文字幕一区二区三区完整版| 好男人资源在线视频观看社区 | 综合图区+亚洲+偷自拍| 日本三级人妻三级欧美三级| 攻从小就想和受做H| 久久爽人人爽久久爽av杏吧| 看黄色片视频| 骚虎高清影院骚虎| 国产伦精品一区二区三区视频金莲 | 五级黄高潮片90分钟视频| 亚洲女同一区 二区三区| 持续推进质量强国建设| 好痛~不要轻一点的视频| 攻让受用下面夹牛奶和水果| yy6080影院| 人人搡人人爱人人超碰 | 超薄透明乳罩情趣丁字内裤| 精品无码国模私拍自拍| 一级毛片直播| 看电影的好处| 国产亚洲精品久久久ai换| 女性与动性ⅩXXXX免费|