亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Golang怎么實現超時退出

發布時間:2021-04-16 16:39:45 來源:億速云 閱讀:176 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關使用Golang怎么實現超時退出,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

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組合。

上述就是小編為大家分享的使用Golang怎么實現超時退出了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

如东县| 阜城县| 玛纳斯县| 通江县| 巴青县| 云安县| 青神县| 常宁市| 英山县| 满洲里市| 石林| 泸西县| 嘉荫县| 彭山县| 禄劝| 祁门县| 金昌市| 东乌| 乌审旗| 厦门市| 全州县| 红原县| 永昌县| 文安县| 永安市| 东安县| 衡山县| 海丰县| 灵山县| 上饶市| 湖州市| 农安县| 深水埗区| 专栏| 临颍县| 牙克石市| 灵台县| 黎川县| 昭苏县| 揭西县| 呼伦贝尔市|