最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言超時退出的三種實現(xiàn)方式總結(jié)

 更新時間:2023年06月18日 09:38:35   作者:242030  
這篇文章主要為大家詳細(xì)介紹了Go語言中超時退出的三種實現(xiàn)方式,文中的示例代碼簡潔易懂,對我們深入了解Go語言有一定的幫助,需要的可以了解一下

1、Go語言三種方式實現(xiàn)超時退出

1.1 context.WithTimeout/context.WithDeadline + time.After

// time.After(time.Duration(time.Millisecond * 700))
package main
import (
	"context"
	"fmt"
	"time"
)
// Golang三種方式實現(xiàn)超時退出-方法1
// 場景:設(shè)定一個超時時間,若是在指定超時時間后沒有返回結(jié)果,則重試
func main() {
	// 經(jīng)過context的WithTimeout設(shè)置一個有效時間為800毫秒的context
	// 該context會在耗盡800毫秒后或者方法執(zhí)行完成后結(jié)束,結(jié)束的時候會向通道ctx.Done發(fā)送信號
	ctx, cancel := context.WithTimeout(context.Background(), time.Duration(time.Millisecond*800))
	// 注意,這里要記得調(diào)用cancel(),否則即便提早執(zhí)行完了,還要傻傻等到800毫秒后context才會被釋放
	defer cancel()
	go func(ctx context.Context) {
		// 發(fā)送HTTP請求
		fmt.Println("處理請求!")
		time.Sleep(800 * time.Millisecond)
		fmt.Println("請求處理完畢!")
	}(ctx)
	select {
	case <-ctx.Done():
		fmt.Println("call successfully!!!")
		return
	// 這里已經(jīng)設(shè)置了context的有效時間,為何還要加上這個time.After呢
	// 這是由于該方法內(nèi)的context是本身聲明的,能夠手動設(shè)置對應(yīng)的超時時間,可是在大多數(shù)場景,這里的ctx是從上游一直傳遞過來的,
	// 對于上游傳遞過來的context還剩多少時間,咱們是不知道的,因此這時候經(jīng)過time.After設(shè)置一個本身預(yù)期的超時時間就頗有必要了
	case <-time.After(time.Duration(time.Millisecond * 700)):
		fmt.Println("timeout!!!")
		return
	}
}

程序輸出

處理請求!
timeout!!!

修改超時時間:

// time.After(time.Duration(time.Millisecond * 1000))
package main
import (
	"context"
	"fmt"
	"time"
)
// Golang三種方式實現(xiàn)超時退出-方法1
// 場景:設(shè)定一個超時時間,若是在指定超時時間后沒有返回結(jié)果,則重試
func main() {
	// 經(jīng)過context的WithTimeout設(shè)置一個有效時間為800毫秒的context
	// 該context會在耗盡800毫秒后或者方法執(zhí)行完成后結(jié)束,結(jié)束的時候會向通道ctx.Done發(fā)送信號
	ctx, cancel := context.WithTimeout(context.Background(), time.Duration(time.Millisecond*800))
	// 注意,這里要記得調(diào)用cancel(),否則即便提早執(zhí)行完了,還要傻傻等到800毫秒后context才會被釋放
	defer cancel()
	go func(ctx context.Context) {
		// 發(fā)送HTTP請求
		fmt.Println("處理請求!")
		time.Sleep(800 * time.Millisecond)
		fmt.Println("請求處理完畢!")
	}(ctx)
	select {
	case <-ctx.Done():
		fmt.Println("call successfully!!!")
		return
	// 這里已經(jīng)設(shè)置了context的有效時間,為何還要加上這個time.After呢
	// 這是由于該方法內(nèi)的context是本身申明的,能夠手動設(shè)置對應(yīng)的超時時間,可是在大多數(shù)場景,這里的ctx是從上游一直傳遞過來的,
	// 對于上游傳遞過來的context還剩多少時間,咱們是不知道的,因此這時候經(jīng)過time.After設(shè)置一個本身預(yù)期的超時時間就頗有必要了
	case <-time.After(time.Duration(time.Millisecond * 1000)):
		fmt.Println("timeout!!!")
		return
	}
}

程序輸出

處理請求!
請求處理完畢!
call successfully!!!

1.2 context.WithTimeout/context.WithDeadline + time.NewTimer

// time.NewTimer(time.Duration(time.Millisecond * 700))
package main
import (
	"context"
	"fmt"
	"time"
)
// Golang三種方式實現(xiàn)超時退出-方法2
// 使用time.NewTimer
func main() {
	ctx, cancel := context.WithTimeout(context.Background(), time.Duration(time.Millisecond*800))
	defer cancel()
	timer := time.NewTimer(time.Duration(time.Millisecond * 700))
	go func(ctx context.Context) {
		// 發(fā)送HTTP請求
		fmt.Println("處理請求!")
		time.Sleep(800 * time.Millisecond)
		fmt.Println("請求處理完畢!")
	}(ctx)
	select {
	case <-ctx.Done():
		timer.Stop()
		timer.Reset(time.Second)
		fmt.Println("call successfully!!!")
		return
	case <-timer.C:
		fmt.Println("timeout!!!")
		return
	}
}

程序輸出

處理請求!
timeout!!!

修改超時間:

// time.NewTimer(time.Duration(time.Millisecond * 1000))
package main
import (
	"context"
	"fmt"
	"time"
)
// Golang三種方式實現(xiàn)超時退出-方法2
// 使用time.NewTimer
func main() {
	ctx, cancel := context.WithTimeout(context.Background(), time.Duration(time.Millisecond*800))
	defer cancel()
	timer := time.NewTimer(time.Duration(time.Millisecond * 1000))
	go func(ctx context.Context) {
		// 發(fā)送HTTP請求
		fmt.Println("處理請求!")
		time.Sleep(800 * time.Millisecond)
		fmt.Println("請求處理完畢!")
	}(ctx)
	select {
	case <-ctx.Done():
		timer.Stop()
		timer.Reset(time.Second)
		fmt.Println("call successfully!!!")
		return
	case <-timer.C:
		fmt.Println("timeout!!!")
		return
	}
}

程序輸出

處理請求!
請求處理完畢!
call successfully!!!

1.3 channel + time.After/time.NewTimer

// time.After(time.Duration(700 * time.Millisecond))
package main
import (
	"context"
	"fmt"
	"time"
)
// Golang三種方式實現(xiàn)超時退出-方法3
// 使用通道
func main() {
	ctx := context.Background()
	done := make(chan struct{}, 1)
	go func(ctx context.Context) {
		// 發(fā)送HTTP請求
		fmt.Println("處理請求!")
		time.Sleep(800 * time.Millisecond)
		fmt.Println("請求處理完畢!")
		done <- struct{}{}
	}(ctx)
	select {
	case <-done:
		fmt.Println("call successfully!!!")
		return
	case <-time.After(time.Duration(700 * time.Millisecond)):
		fmt.Println("timeout!!!")
		return
	}
}

程序輸出

處理請求!
timeout!!!

修改超時時間:

// time.After(time.Duration(1000 * time.Millisecond))
package main
import (
	"context"
	"fmt"
	"time"
)
// Golang三種方式實現(xiàn)超時退出-方法3
// 使用通道
func main() {
	ctx := context.Background()
	done := make(chan struct{}, 1)
	go func(ctx context.Context) {
		// 發(fā)送HTTP請求
		fmt.Println("處理請求!")
		time.Sleep(800 * time.Millisecond)
		fmt.Println("請求處理完畢!")
		done <- struct{}{}
	}(ctx)
	select {
	case <-done:
		fmt.Println("call successfully!!!")
		return
	case <-time.After(time.Duration(1000 * time.Millisecond)):
		fmt.Println("timeout!!!")
		return
	}
}

程序輸出

處理請求!
請求處理完畢!
call successfully!!!

到此這篇關(guān)于Go語言超時退出的三種實現(xiàn)方式總結(jié)的文章就介紹到這了,更多相關(guān)Go語言超時退出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang動態(tài)創(chuàng)建類的示例代碼

    golang動態(tài)創(chuàng)建類的示例代碼

    這篇文章主要介紹了golang動態(tài)創(chuàng)建類的實例代碼,本文通過實例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • GOLang判斷進(jìn)程是否存在實現(xiàn)方式

    GOLang判斷進(jìn)程是否存在實現(xiàn)方式

    該文主要介紹了使用Go語言編寫進(jìn)程檢測工具的方法,由于Go語言本身沒有直接獲取進(jìn)程信息的功能,作者決定通過執(zhí)行命令的方式實現(xiàn),最終給出了優(yōu)化后的代碼示例
    2026-04-04
  • go語言入門環(huán)境搭建及GoLand安裝教程詳解

    go語言入門環(huán)境搭建及GoLand安裝教程詳解

    這篇文章主要介紹了go語言入門環(huán)境搭建及GoLand安裝教程詳解,需要的朋友可以參考下
    2020-12-12
  • 在Linux系統(tǒng)中安裝Go語言的詳細(xì)教程

    在Linux系統(tǒng)中安裝Go語言的詳細(xì)教程

    這篇文章主要介紹了在Linux系統(tǒng)中安裝Go語言的詳細(xì)教程,由于國內(nèi)很多人對谷歌的盲目追捧,導(dǎo)致Go語言在國內(nèi)的人氣遠(yuǎn)超國外...需要的朋友可以參考下
    2015-06-06
  • Go語言封裝一個Cron定時任務(wù)管理器

    Go語言封裝一個Cron定時任務(wù)管理器

    在現(xiàn)代應(yīng)用中,定時任務(wù)是非常常見的需求,無論是用于定時清理數(shù)據(jù),還是定時執(zhí)行系統(tǒng)維護(hù)任務(wù),下面我們就來使用Go語言封裝一個Cron定時任務(wù)管理器吧
    2024-12-12
  • Golang 空結(jié)構(gòu)體特性與用法詳解

    Golang 空結(jié)構(gòu)體特性與用法詳解

    本文主要介紹了Golang 空結(jié)構(gòu)體特性與用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • 詳解如何使用Go模塊進(jìn)行依賴管理

    詳解如何使用Go模塊進(jìn)行依賴管理

    本文將介紹Go語言中的模塊(module)概念,以及如何使用Go模塊進(jìn)行依賴管理,我們會探討模塊的基本概念、使用方法、配置和依賴關(guān)系管理等方面的內(nèi)容,需要的朋友可以參考下
    2023-10-10
  • go protobuf?詳解

    go protobuf?詳解

    Protobuf是Protocol Buffers的簡稱,它是Google公司開發(fā)的一種數(shù)據(jù)描述語言,是一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲格式,可以用于結(jié)構(gòu)化數(shù)據(jù)串行化,或者說序列化,這篇文章主要介紹了protobuf?詳解,需要的朋友可以參考下
    2024-01-01
  • Go語言文件讀寫操作案例詳解

    Go語言文件讀寫操作案例詳解

    這篇文章主要為大家介紹了Go語言文件讀寫操作案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 淺談go語言內(nèi)存逃逸現(xiàn)象

    淺談go語言內(nèi)存逃逸現(xiàn)象

    本文主要介紹了淺談go語言內(nèi)存逃逸現(xiàn)象,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-10-10

最新評論

仙桃市| 沾益县| 梧州市| 梁山县| 类乌齐县| 巴马| 嫩江县| 清镇市| 灌阳县| 玉山县| 武清区| 大英县| 大连市| 景洪市| 南昌县| 寻乌县| 高淳县| 兴安县| 西昌市| 长葛市| 扎兰屯市| 潞城市| 墨玉县| 麻城市| 尉氏县| 东丰县| 旺苍县| 托克托县| 昌乐县| 汉阴县| 阳春市| 永登县| 鹤峰县| 禄劝| 阳山县| 新营市| 祁东县| 顺昌县| 阿鲁科尔沁旗| 铜梁县| 安义县|