這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)使用Golang怎么實(shí)現(xiàn)超時(shí)退出,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、湘潭縣網(wǎng)絡(luò)推廣、小程序設(shè)計(jì)、湘潭縣網(wǎng)絡(luò)營銷、湘潭縣企業(yè)策劃、湘潭縣品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供湘潭縣建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:muchs.cn
1、通過context的WithTimeout設(shè)置一個(gè)有效時(shí)間為800毫秒的context。
2、該context會在耗盡800毫秒后或者方法執(zhí)行完成后結(jié)束,結(jié)束的時(shí)候會向通道ctx.Done發(fā)送信號。
3、有人可能要問,你這里已經(jīng)設(shè)置了context的有效時(shí)間,為什么還要加上這個(gè)time.After呢?
這是因?yàn)樵摲椒▋?nèi)的context是自己申明的,可以手動設(shè)置對應(yīng)的超時(shí)時(shí)間,但是在大多數(shù)場景,這里的ctx是從上游一直傳遞過來的,對于上游傳遞過來的context還剩多少時(shí)間,我們是不知道的,所以這時(shí)候通過time.After設(shè)置一個(gè)自己預(yù)期的超時(shí)時(shí)間就很有必要了。
4、注意,這里要記得調(diào)用cancel()
,不然即使提前執(zhí)行完了,還要傻傻等到800毫秒后context才會被釋放。
總結(jié)
上面的超時(shí)控制是搭配使用了ctx.Done
和time.After。
Done通道負(fù)責(zé)監(jiān)聽context啥時(shí)候完事,如果在time.After設(shè)置的超時(shí)時(shí)間到了,你還沒完事,那我就不等了,執(zhí)行超時(shí)后的邏輯代碼。
舉一反三
那么,除了上面這種超時(shí)控制策略,還有其他的套路嗎?
有,但是大同小異。
第一種:使用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) { // 發(fā)送HTTP請求 }() select { case <-ctx.Done(): timer.Stop() timer.Reset(time.Second) fmt.Println("call successfully!!!") return case <-timer.C: fmt.Println("timeout!!!") return } }
這里的主要區(qū)別是將time.After換成了time.NewTimer
,也是同樣的思路如果接口調(diào)用提前完成,則監(jiān)聽到Done信號,然后關(guān)閉定時(shí)器。
否則的話,會在指定的timer即900毫秒后執(zhí)行超時(shí)后的業(yè)務(wù)邏輯。
第二種:使用通道
func AsyncCall() { ctx := context.Background() done := make(chan struct{}, 1) go func(ctx context.Context) { // 發(fā)送HTTP請求 done <- struct{}{} }() select { case <-done: fmt.Println("call successfully!!!") return case <-time.After(time.Duration(800 * time.Millisecond)): fmt.Println("timeout!!!") return } }
1、這里主要利用通道可以在協(xié)程之間通信的特點(diǎn),當(dāng)調(diào)用成功后,向done通道發(fā)送信號。
2、監(jiān)聽Done信號,如果在time.After超時(shí)時(shí)間之前接收到,則正常返回,否則走向time.After的超時(shí)邏輯,執(zhí)行超時(shí)邏輯代碼。
3、這里使用的是通道和time.After組合,也可以使用通道和time.NewTimer組合。
上述就是小編為大家分享的使用Golang怎么實(shí)現(xiàn)超時(shí)退出了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
文章題目:使用Golang怎么實(shí)現(xiàn)超時(shí)退出
本文地址:http://muchs.cn/article20/igeoco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站收錄、企業(yè)建站、、網(wǎng)站改版、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)