国产欧美日韩三区_偷窥自拍亚洲色图精选_久久大片网站_成人在线黄色_成人亚洲免费视频_99久久久精品_国产美女自拍_韩国19禁主播vip福利视频_色综合视频一区二区三区日韩_日本在线观看一区二区

當前位置:首頁 > 科技  > 知識百科

細數 Context 使用場景

來源: 責編: 時間:2023-08-07 16:29:55 303觀看
導讀 你好,我是四哥。前一篇文章從源碼的角度詳細介紹了 Context 的實現原理,但是還沒有提到 Context 的使用場景,今天我們一起來看下:1.請求鏈路傳值。傳值使用方式如下:func func1(c

你好,我是四哥。o3M28資訊網——每日最新資訊28at.com

前一篇文章從源碼的角度詳細介紹了 Context 的實現原理,但是還沒有提到 Context 的使用場景,今天我們一起來看下:o3M28資訊網——每日最新資訊28at.com

1.請求鏈路傳值。o3M28資訊網——每日最新資訊28at.com

傳值使用方式如下:o3M28資訊網——每日最新資訊28at.com

func func1(ctx context.Context) {o3M28資訊網——每日最新資訊28at.com
ctx = context.WithValue(ctx, "k1", "v1")o3M28資訊網——每日最新資訊28at.com
func2(ctx)o3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com
o3M28資訊網——每日最新資訊28at.com
func func2(ctx context.Context) {o3M28資訊網——每日最新資訊28at.com
fmt.Println("func2:",ctx.Value("k1").(string))o3M28資訊網——每日最新資訊28at.com
ctx = context.WithValue(ctx, "k2", "v2")o3M28資訊網——每日最新資訊28at.com
func3(ctx)o3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com
o3M28資訊網——每日最新資訊28at.com
func func3(ctx context.Context) {o3M28資訊網——每日最新資訊28at.com
fmt.Println("func3:",ctx.Value("k1").(string))o3M28資訊網——每日最新資訊28at.com
fmt.Println("func3:",ctx.Value("k2").(string))o3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com
o3M28資訊網——每日最新資訊28at.com
func main() {o3M28資訊網——每日最新資訊28at.com
ctx := context.Background()o3M28資訊網——每日最新資訊28at.com
func1(ctx)o3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com

我們在 func1() 通過函數 WithValue() 設置了一個鍵值對 k1-v1,在 func2() 可以獲取到 func1() 設置的鍵值對,如果調用 func3() 時把這個 ctx 繼續傳入的話,在 func3() 中依然還是可以獲取到 k1-v1。o3M28資訊網——每日最新資訊28at.com

但是在 func1() 中獲取不到 func2() 設置的鍵值對 k2-v2,因為 context 只能自上而下攜帶值,這點需要注意。o3M28資訊網——每日最新資訊28at.com

2.取消耗時操作,及時釋放資源。o3M28資訊網——每日最新資訊28at.com

使用 channel + select 的機制:o3M28資訊網——每日最新資訊28at.com

func func1() error {o3M28資訊網——每日最新資訊28at.com
respC := make(chan int) // 起消息通知作用o3M28資訊網——每日最新資訊28at.com
// 處理邏輯o3M28資訊網——每日最新資訊28at.com
go func() {o3M28資訊網——每日最新資訊28at.com
time.Sleep(time.Second * 3) // 模擬處理業務邏輯o3M28資訊網——每日最新資訊28at.com
respC close(respC)o3M28資訊網——每日最新資訊28at.com
}()o3M28資訊網——每日最新資訊28at.com
o3M28資訊網——每日最新資訊28at.com
// 判斷是否超時o3M28資訊網——每日最新資訊28at.com
select {o3M28資訊網——每日最新資訊28at.com
case r := <-respC:o3M28資訊網——每日最新資訊28at.com
fmt.Printf("Resp: %d ", r)o3M28資訊網——每日最新資訊28at.com
return nilo3M28資訊網——每日最新資訊28at.com
case <-time.After(time.Second * 2): // 超過設置的時間就報錯o3M28資訊網——每日最新資訊28at.com
fmt.Println("catch timeout")o3M28資訊網——每日最新資訊28at.com
return errors.New("timeout")o3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com
o3M28資訊網——每日最新資訊28at.com
func main() {o3M28資訊網——每日最新資訊28at.com
err := func1()o3M28資訊網——每日最新資訊28at.com
fmt.Printf("func1 error: %v ", err)o3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com

上面的方式平時也會用到,通過 context 怎么實現呢?o3M28資訊網——每日最新資訊28at.com

下面來看下如何使用 context 進行主動取消、超時取消。o3M28資訊網——每日最新資訊28at.com

主動取消:o3M28資訊網——每日最新資訊28at.com

func func1(ctx context.Context, wg *sync.WaitGroup) error {o3M28資訊網——每日最新資訊28at.com
defer wg.Done()o3M28資訊網——每日最新資訊28at.com
respC := make(chan int)o3M28資訊網——每日最新資訊28at.com
go func() {o3M28資訊網——每日最新資訊28at.com
time.Sleep(time.Second * 5) // 模擬業務邏輯處理o3M28資訊網——每日最新資訊28at.com
respC }()o3M28資訊網——每日最新資訊28at.com
// 取消機制o3M28資訊網——每日最新資訊28at.com
select {o3M28資訊網——每日最新資訊28at.com
case <-ctx.Done():o3M28資訊網——每日最新資訊28at.com
fmt.Println("cancel")o3M28資訊網——每日最新資訊28at.com
return errors.New("cancel")o3M28資訊網——每日最新資訊28at.com
case r := <-respC:o3M28資訊網——每日最新資訊28at.com
fmt.Println(r)o3M28資訊網——每日最新資訊28at.com
return nilo3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com
o3M28資訊網——每日最新資訊28at.com
func main() {o3M28資訊網——每日最新資訊28at.com
wg := &sync.WaitGroup{}o3M28資訊網——每日最新資訊28at.com
ctx, cancel := context.WithCancel(context.Background())o3M28資訊網——每日最新資訊28at.com
wg.Add(1)o3M28資訊網——每日最新資訊28at.com
go func1(ctx, wg)o3M28資訊網——每日最新資訊28at.com
time.Sleep(time.Second * 2)o3M28資訊網——每日最新資訊28at.com
cancel() // 主動取消o3M28資訊網——每日最新資訊28at.com
wg.Wait() // 等待 goroutine 退出o3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com

超時取消:o3M28資訊網——每日最新資訊28at.com

func func1(ctx context.Context) {o3M28資訊網——每日最新資訊28at.com
resp := make(chan int)o3M28資訊網——每日最新資訊28at.com
go func() {o3M28資訊網——每日最新資訊28at.com
time.Sleep(time.Second * 5) // 模擬處理邏輯o3M28資訊網——每日最新資訊28at.com
resp }()o3M28資訊網——每日最新資訊28at.com
// 超時機制o3M28資訊網——每日最新資訊28at.com
select {o3M28資訊網——每日最新資訊28at.com
case <-ctx.Done():o3M28資訊網——每日最新資訊28at.com
fmt.Println("ctx timeout")o3M28資訊網——每日最新資訊28at.com
fmt.Println(ctx.Err())o3M28資訊網——每日最新資訊28at.com
case <-resp:o3M28資訊網——每日最新資訊28at.com
fmt.Println("done")o3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com
returno3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com
func main() {o3M28資訊網——每日最新資訊28at.com
ctx, cancel := context.WithTimeout(context.Background(), time.Second*2)o3M28資訊網——每日最新資訊28at.com
defer cancel()o3M28資訊網——每日最新資訊28at.com
func1(ctx)o3M28資訊網——每日最新資訊28at.com
}3.防止 goroutine 泄露。o3M28資訊網——每日最新資訊28at.com

引自【深度解密 Go 語言之 context[1]】o3M28資訊網——每日最新資訊28at.com

func gen() ch := make(chan int)o3M28資訊網——每日最新資訊28at.com
go func() {o3M28資訊網——每日最新資訊28at.com
var n into3M28資訊網——每日最新資訊28at.com
for {o3M28資訊網——每日最新資訊28at.com
ch n++o3M28資訊網——每日最新資訊28at.com
time.Sleep(time.Second)o3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com
}()o3M28資訊網——每日最新資訊28at.com
return cho3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com

這是一個可以生成無限整數的協程,但如果我只需要它產生的前 5 個數,那么就會發生 goroutine 泄漏:o3M28資訊網——每日最新資訊28at.com

func main() {o3M28資訊網——每日最新資訊28at.com
for n := range gen() {o3M28資訊網——每日最新資訊28at.com
fmt.Println(n)o3M28資訊網——每日最新資訊28at.com
if n == 5 {o3M28資訊網——每日最新資訊28at.com
breako3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com
// ……o3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com

當 n == 5 的時候,直接 break 掉。那么 gen 函數的協程就會執行無限循環,永遠不會停下來。發生了 goroutine 泄漏。o3M28資訊網——每日最新資訊28at.com

用 context 改進這個例子:o3M28資訊網——每日最新資訊28at.com

func gen(ctx context.Context) ch := make(chan int)o3M28資訊網——每日最新資訊28at.com
go func() {o3M28資訊網——每日最新資訊28at.com
var n into3M28資訊網——每日最新資訊28at.com
for {o3M28資訊網——每日最新資訊28at.com
select {o3M28資訊網——每日最新資訊28at.com
case <-ctx.Done():o3M28資訊網——每日最新資訊28at.com
returno3M28資訊網——每日最新資訊28at.com
case ch n++o3M28資訊網——每日最新資訊28at.com
time.Sleep(time.Second)o3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com
}()o3M28資訊網——每日最新資訊28at.com
return cho3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com
o3M28資訊網——每日最新資訊28at.com
func main() {o3M28資訊網——每日最新資訊28at.com
ctx, cancel := context.WithCancel(context.Background())o3M28資訊網——每日最新資訊28at.com
defer cancel() // 避免其他地方忘記 cancel,且重復調用不影響o3M28資訊網——每日最新資訊28at.com
o3M28資訊網——每日最新資訊28at.com
for n := range gen(ctx) {o3M28資訊網——每日最新資訊28at.com
fmt.Println(n)o3M28資訊網——每日最新資訊28at.com
if n == 5 {o3M28資訊網——每日最新資訊28at.com
cancel()o3M28資訊網——每日最新資訊28at.com
breako3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com
// ……o3M28資訊網——每日最新資訊28at.com
}o3M28資訊網——每日最新資訊28at.com

增加一個 context,在 break 前調用 cancel 函數,取消 goroutine。gen 函數在接收到取消信號后,直接退出,系統回收資源。o3M28資訊網——每日最新資訊28at.com

總結o3M28資訊網——每日最新資訊28at.com

這篇文章列出的幾個例子是 context 最基本的使用場景,其他框架、第三包基本上都是從這幾種用法擴展的,所以非常有必要掌握基礎用法。o3M28資訊網——每日最新資訊28at.com

另外希望這篇文章能給你帶來幫助,如果文中有理解錯誤之處或者你還想到其他用法,可以在留言區留言,一定回復!抱團學習不孤單!o3M28資訊網——每日最新資訊28at.com

參考資料o3M28資訊網——每日最新資訊28at.com

[1]深度解密Go語言之context: https://qcrao.com/2019/06/12/dive-into-go-context/o3M28資訊網——每日最新資訊28at.com

本文鏈接:http://www.yifxia.cn/showinfo-119-2167-0.html細數 Context 使用場景

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 云計算開發:Python3-isdecimal()方法詳解

下一篇: 數據分析八大模型:漏斗模型

標簽:
  • 熱門焦點
  • 官方承諾:K60至尊版將會首批升級MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版將會搭載天璣9200+處理器和獨顯芯片X7的同時,Redmi給出了官方承諾,K60至尊重大更新首批升級,會首批推送MIUI 15。也就是說雖然
  • 對標蘋果的靈動島 華為帶來實況窗功能

    繼蘋果的靈動島之后,華為也在今天正式推出了“實況窗”功能。據今天鴻蒙OS 4.0的現場演示顯示,華為的實況窗可以更高效的展現出實時通知,比如鎖屏上就能看到外賣、打車、銀行
  • 小米降噪藍牙耳機Necklace分享:聽一首歌 讀懂一個故事

    在今天下午的小米Civi 2新品發布會上,小米還帶來了一款新的降噪藍牙耳機Necklace,我們也在發布結束的第一時間給大家帶來這款耳機的簡單分享。現在大家能見到最多的藍牙耳機
  • 5月iOS設備性能榜:M1 M2依舊是榜單前五

    和上個月一樣,沒有新品發布的iOS設備性能榜的上榜設備并沒有什么更替,僅僅只有跑分變化而產生的排名變動,剛剛開始的蘋果WWDC2023,推出的產品也依舊是新款Mac Pro、新款Mac Stu
  • 多線程開發帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結束訪問某一數據期間,該數據被其他的線程所修改,那么對于當前線程而言,該線程
  • 一個注解實現接口冪等,這樣才優雅!

    場景碼猿慢病云管理系統中其實高并發的場景不是很多,沒有必要每個接口都去考慮并發高的場景,比如添加住院患者的這個接口,具體的業務代碼就不貼了,業務偽代碼如下:圖片上述代碼有
  • 品牌洞察丨服務本地,美團直播成效幾何?

    來源:17PR7月11日,美團App首頁推薦位出現&ldquo;美團直播&rdquo;的固定入口。在直播聚合頁面,外賣&ldquo;神槍手&rdquo;直播間、美團旅行直播間、美團買菜直播間等均已上線,同時
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級不香了。俗話說,兵無常勢,水無常形,互聯網企業調整職級體系并不稀奇。7月13日,淘寶天貓集團啟動了近年來最大的人力制度改革,目前已形成一
  • OPPO、vivo、小米等國內廠商Q2在印度智能手機市場份額依舊高達55%

    7月20日消息,據外媒報道,研究機構的報告顯示,在全球智能手機出貨量同比仍在下滑的大背景下,印度這一有潛力的市場也未能幸免,出貨量同比也有下滑,多家廠
Top 日日夜夜婷婷| 国产视频一区在线| 一级片免费在线观看视频| 青青久久精品| 午夜在线影院| 日日日夜夜操| 国产伦精品一区二区三区在线观看 | 欧美日本免费| 香蕉视频久久| 国产不卡精品一区二区三区| 一级女性全黄久久生活片| 一级毛片视频在线观看| 日韩av片免费播放| 日韩中文字幕在线播放| 色综合久久天天综合观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 超级乱淫伦动漫| 91麻豆精品国产自产在线观看一区 | 日韩在线观看免费| 精品视频在线观看免费 | 亚洲天堂在线播放| 日本特黄特色aaa大片免费| 天天色成人网| 国产成人女人在线视频观看| 久久久久久久男人的天堂| 91麻豆国产| 午夜激情视频在线播放| 日韩欧美一二三区| 亚洲天堂免费| 精品视频免费看| 国产精品自拍一区| 成人影院久久久久久影院| 国产伦精品一区二区三区在线观看 | 麻豆污视频| 欧美18性精品| 国产一区二区福利久久| 国产亚洲精品成人a在线| 精品久久久久久中文字幕2017| 日韩在线观看免费| 午夜精品国产自在现线拍| 欧美激情伊人| 久草免费在线观看| 国产成人精品影视| 久久国产精品永久免费网站| 亚洲精品中文字幕久久久久久| 麻豆系列 在线视频| 九九精品久久久久久久久| 青青久久精品| 一级毛片视频在线观看| 欧美a免费| 日韩男人天堂| 国产不卡精品一区二区三区| 久久99青青久久99久久| 二级特黄绝大片免费视频大片| 色综合久久天天综合观看| 精品久久久久久综合网| 可以免费在线看黄的网站| 四虎影视久久久免费| 免费一级片在线| 午夜精品国产自在现线拍| 国产一区二区精品| 亚洲精品永久一区| 四虎影视精品永久免费网站| 日本免费区| 日韩av片免费播放| 国产成人精品综合久久久| 一级片免费在线观看视频| 欧美激情一区二区三区在线播放 | 九九久久99| 美国一区二区三区| 日韩一级黄色| 欧美大片一区| 国产极品白嫩美女在线观看看| 欧美国产日韩一区二区三区| 精品久久久久久综合网| 国产视频一区二区在线观看| 一级片免费在线观看视频| 国产国语对白一级毛片| 精品在线观看国产| 久久99青青久久99久久| 国产视频网站在线观看| 久草免费资源| 欧美一级视频高清片| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 日韩在线观看网站| 国产高清在线精品一区a| 精品久久久久久影院免费| 精品国产香蕉伊思人在线又爽又黄| 午夜欧美成人久久久久久| 成人高清免费| 999久久狠狠免费精品| 欧美另类videosbestsex高清| 国产91精品系列在线观看| 欧美激情伊人| 精品国产一区二区三区久久久蜜臀 | 高清一级淫片a级中文字幕| 欧美一区二区三区在线观看| 一a一级片| 成人高清视频在线观看| 韩国毛片| 久久国产一久久高清| 精品视频一区二区| 一级毛片视频在线观看| 日韩欧美一二三区| 国产成a人片在线观看视频| 国产不卡精品一区二区三区| 精品在线免费播放| 麻豆污视频| 精品国产亚洲人成在线| 精品国产一区二区三区久久久蜜臀 | 亚欧成人毛片一区二区三区四区| 午夜精品国产自在现线拍| 二级特黄绝大片免费视频大片| 999精品视频在线| 国产网站免费视频| 欧美激情一区二区三区视频 | 国产欧美精品| 韩国三级视频网站| 精品国产一区二区三区免费| 999久久狠狠免费精品| 久久福利影视| 成人免费观看男女羞羞视频| 亚久久伊人精品青青草原2020| 91麻豆tv| 亚欧成人毛片一区二区三区四区| 黄视频网站免费看| 久久99中文字幕久久| 午夜激情视频在线播放| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 青青青草视频在线观看| 四虎影视久久久免费| 国产成人精品影视| 国产欧美精品| 欧美另类videosbestsex高清| 成人免费网站久久久| 国产韩国精品一区二区三区| 四虎影视久久久免费| 成人免费一级纶理片 | 超级乱淫伦动漫| 精品国产亚一区二区三区| 黄视频网站免费看| 久久成人性色生活片| 成人a级高清视频在线观看| 91麻豆精品国产高清在线| 欧美另类videosbestsex高清| 久久精品大片| 日韩欧美一二三区| 九九精品久久久久久久久| 国产不卡福利| 国产视频一区在线| 欧美1区2区3区| 黄色免费三级| 亚久久伊人精品青青草原2020| 欧美激情一区二区三区在线| 国产伦精品一区二区三区无广告| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 二级片在线观看| 欧美日本免费| 你懂的日韩| 久久成人性色生活片| 久久精品大片| 国产成人精品影视| 成人免费一级纶理片 | 91麻豆精品国产高清在线| 国产精品1024在线永久免费 | 精品国产三级a| 久久久成人网| 麻豆系列 在线视频| 国产激情一区二区三区| 亚洲天堂在线播放| 免费毛片基地| 国产视频一区二区在线观看| 久久国产精品自线拍免费| 国产麻豆精品| 一级片免费在线观看视频| 国产一区二区精品久| 欧美另类videosbestsex高清| 欧美大片aaaa一级毛片| 国产视频网站在线观看| 天天做人人爱夜夜爽2020| 久久久久久久男人的天堂| 日韩男人天堂| 成人免费观看男女羞羞视频| 久久久久久久久综合影视网| 国产伦久视频免费观看 视频| 国产成人精品影视| 国产伦理精品| 精品在线免费播放| 亚洲精品影院久久久久久| 欧美1区2区3区| 国产a视频| 精品久久久久久影院免费| 国产a视频| 成人高清免费| 美女免费精品视频在线观看| 韩国三级视频网站| 国产麻豆精品高清在线播放| 日韩中文字幕在线播放| 国产成人精品综合久久久|