成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > golang中context的作用詳解

golang中context的作用詳解

熱門標(biāo)簽:不封卡外呼系統(tǒng) 仙桃400電話辦理 地圖標(biāo)注免費(fèi)定制店 宿遷便宜外呼系統(tǒng)代理商 上海極信防封電銷卡價(jià)格 鄭州智能語音電銷機(jī)器人價(jià)格 重慶慶云企業(yè)400電話到哪申請 寧波語音外呼系統(tǒng)公司 湛江crm外呼系統(tǒng)排名

當(dāng)一個(gè)goroutine可以啟動(dòng)其他goroutine,而這些goroutine可以啟動(dòng)其他goroutine,依此類推,則第一個(gè)goroutine應(yīng)該能夠向所有其它goroutine發(fā)送取消信號。

上下文包的唯一目的是在goroutine之間執(zhí)行取消信號,而不管它們?nèi)绾紊?。上下文的接口定義為:

type Context interface {
 Deadline() (deadline time.Time, ok bool)
 Done() - chan struct{}
 Err() error
 Value(key interface{}) interface{}
}
  • Deadline:第一個(gè)值是截止日期,此時(shí)上下文將自動(dòng)觸發(fā)“取消”操作。第二個(gè)值是布爾值,true表示設(shè)置了截止日期,false表示未設(shè)置截止時(shí)間。如果沒有設(shè)置截止日期,則必須手動(dòng)調(diào)用cancel函數(shù)來取消上下文。
  • Done:返回一個(gè)只讀通道(僅在取消后),鍵入struct {},當(dāng)該通道可讀時(shí),表示父上下文已經(jīng)發(fā)起了取消請求,根據(jù)此信號,開發(fā)人員可以執(zhí)行一些清除操作,退出goroutine
  • Err:返回取消上下文的原因
  • Value:返回綁定到上下文的值,它是一個(gè)鍵值對,因此您需要傳遞一個(gè)Key來獲取相應(yīng)的值,此值是線程安全的

要?jiǎng)?chuàng)建上下文,必須指定父上下文。兩個(gè)內(nèi)置上下文(背景和待辦事項(xiàng))用作頂級父上下文:

var (
 background = new(emptyCtx)
 todo = new(emptyCtx)
)
func Background() Context {
 return background
}
func TODO() Context {
 return todo
}

背景,主要ü在主函數(shù),初始化和測試代碼的sed,是樹結(jié)構(gòu)中,根上下文,這是不能被取消的頂層語境。TODO,當(dāng)您不知道要使用什么上下文時(shí),可以使用它。它們本質(zhì)上都是emptyCtx類型,都是不可取消的,沒有固定的期限,也沒有為Context賦任何值:鍵入emptyCtx int

type emptyCtx int
func (_ *emptyCtx) Deadline() (deadline time.Time, ok bool) {
 return
}
func (_ *emptyCtx) Done() - chan struct{} {
 return nil
}
func (_ *emptyCtx) Err() error {
 return nil
}
func (*emptyCtx) Value(key interface{}) interface{} {
 return nil
}

上下文包還具有幾個(gè)常用功能:func WithCancel(父上下文)(ctx上下文,取消CancelFunc)func WithDeadline(父上下文,截止時(shí)間.Time)(上下文,CancelFunc)func WithTimeout(父上下文,超時(shí)時(shí)間。持續(xù)時(shí)間)(上下文,CancelFunc)func WithValue(父上下文,鍵,val接口{})上下文

請注意,這些方法意味著可以一次繼承上下文以實(shí)現(xiàn)其他功能,例如,使用WithCancel函數(shù)傳入根上下文,它會(huì)創(chuàng)建一個(gè)子上下文,該子上下文具有取消上下文的附加功能,然后使用此方法將context(context01)作為父上下文,并將其作為第一個(gè)參數(shù)傳遞給WithDeadline函數(shù),與子context(context01)相比,獲得子context(context02),它具有一個(gè)附加功能,可在之后自動(dòng)取消上下文最后期限。

WithCancel

對于通道,盡管通道也可以通知許多嵌套的goroutine退出,但通道不是線程安全的,而上下文是線程安全的。

例如:

package main
import (
 "runtime"
 "fmt"
 "time"
 "context"
)
func monitor2(ch chan bool, index int) {
 for {
  select {
  case v := - ch:
   fmt.Printf("monitor2: %v, the received channel value is: %v, ending\n", index, v)
   return
  default:
   fmt.Printf("monitor2: %v in progress...\n", index)
   time.Sleep(2 * time.Second)
  }
 }
}
func monitor1(ch chan bool, index int) {
 for {
  go monitor2(ch, index)
  select {
  case v := - ch:
   // this branch is only reached when the ch channel is closed, or when data is sent(either true or false)
   fmt.Printf("monitor1: %v, the received channel value is: %v, ending\n", index, v)
   return
  default:
   fmt.Printf("monitor1: %v in progress...\n", index)
   time.Sleep(2 * time.Second)
  }
 }
}
func main() {
 var stopSingal chan bool = make(chan bool, 0)
 for i := 1; i = 5; i = i + 1 {
  go monitor1(stopSingal, i)
 }
 time.Sleep(1 * time.Second)
 // close all gourtines
 cancel()
 // waiting 10 seconds, if the screen does not display monitorX: xxxx in progress...>, all goroutines have been shut down
 time.Sleep(10 * time.Second)
 println(runtime.NumGoroutine())
 println("main program exit!!!!")
}

執(zhí)行的結(jié)果是:

monitor1: 5 in progress...
monitor2: 5 in progress...
monitor1: 2 in progress...
monitor2: 2 in progress...
monitor2: 1 in progress...
monitor1: 1 in progress...
monitor1: 4 in progress...
monitor1: 3 in progress...
monitor2: 4 in progress...
monitor2: 3 in progress...
monitor1: 4, the received channel value is: false, ending
monitor1: 3, the received channel value is: false, ending
monitor2: 2, the received channel value is: false, ending
monitor2: 1, the received channel value is: false, ending
monitor1: 1, the received channel value is: false, ending
monitor2: 5, the received channel value is: false, ending
monitor2: 3, the received channel value is: false, ending
monitor2: 3, the received channel value is: false, ending
monitor2: 4, the received channel value is: false, ending
monitor2: 5, the received channel value is: false, ending
monitor2: 1, the received channel value is: false, ending
monitor1: 5, the received channel value is: false, ending
monitor1: 2, the received channel value is: false, ending
monitor2: 2, the received channel value is: false, ending
monitor2: 4, the received channel value is: false, ending
1
main program exit!!!!

這里使用一個(gè)通道向所有g(shù)oroutine發(fā)送結(jié)束通知,但是這里的情況相對簡單,如果在一個(gè)復(fù)雜的項(xiàng)目中,假設(shè)多個(gè)goroutine有某種錯(cuò)誤并重復(fù)執(zhí)行,則可以重復(fù)關(guān)閉或關(guān)閉該通道通道,然后向其寫入值,從而觸發(fā)運(yùn)行時(shí)恐慌。這就是為什么我們使用上下文來避免這些問題的原因,以WithCancel為例:

package main
import (
 "runtime"
 "fmt"
 "time"
 "context"
)
func monitor2(ctx context.Context, number int) {
 for {
  select {
  case v := - ctx.Done():
   fmt.Printf("monitor: %v, the received channel value is: %v, ending\n", number,v)
   return
  default:
   fmt.Printf("monitor: %v in progress...\n", number)
   time.Sleep(2 * time.Second)
  }
 }
}
func monitor1(ctx context.Context, number int) {
 for {
  go monitor2(ctx, number)
  select {
  case v := - ctx.Done():
   // this branch is only reached when the ch channel is closed, or when data is sent(either true or false)
   fmt.Printf("monitor: %v, the received channel value is: %v, ending\n", number, v)
   return
  default:
   fmt.Printf("monitor: %v in progress...\n", number)
   time.Sleep(2 * time.Second)
  }
 }
}
func main() {
 var ctx context.Context = nil
 var cancel context.CancelFunc = nil
 ctx, cancel = context.WithCancel(context.Background())
 for i := 1; i = 5; i = i + 1 {
  go monitor1(ctx, i)
 }
 time.Sleep(1 * time.Second)
 // close all gourtines
 cancel()
 // waiting 10 seconds, if the screen does not display monitor: xxxx in progress>, all goroutines have been shut down
 time.Sleep(10 * time.Second)
 println(runtime.NumGoroutine())
 println("main program exit!!!!")
}

WithTimeout和WithDeadline

WithTimeout和WithDeadline在用法和功能上基本相同,它們都表示上下文將在一定時(shí)間后自動(dòng)取消,唯一的區(qū)別可以從函數(shù)的定義中看出,傳遞給WithDeadline的第二個(gè)參數(shù)是類型time.Duration類型,它是一個(gè)相對時(shí)間,表示取消超時(shí)后的時(shí)間。例:

package main
import (
 "runtime"
 "fmt"
 "time"
 "context"
)
func monitor2(ctx context.Context, index int) {
 for {
  select {
  case v := - ctx.Done():
   fmt.Printf("monitor2: %v, the received channel value is: %v, ending\n", index, v)
   return
  default:
   fmt.Printf("monitor2: %v in progress...\n", index)
   time.Sleep(2 * time.Second)
  }
 }
}
func monitor1(ctx context.Context, index int) {
 for {
  go monitor2(ctx, index)
  select {
  case v := - ctx.Done():
   // this branch is only reached when the ch channel is closed, or when data is sent(either true or false)
   fmt.Printf("monitor1: %v, the received channel value is: %v, ending\n", index, v)
   return
  default:
   fmt.Printf("monitor1: %v in progress...\n", index)
   time.Sleep(2 * time.Second)
  }
 }
}
func main() {
 var ctx01 context.Context = nil
 var ctx02 context.Context = nil
 var cancel context.CancelFunc = nil
 ctx01, cancel = context.WithCancel(context.Background())
 ctx02, cancel = context.WithDeadline(ctx01, time.Now().Add(1 * time.Second)) // If it's WithTimeout, just change this line to "ctx02, cancel = context.WithTimeout(ctx01, 1 * time.Second)"
 defer cancel()
 for i := 1; i = 5; i = i + 1 {
  go monitor1(ctx02, i)
 }
 time.Sleep(5 * time.Second)
 if ctx02.Err() != nil {
  fmt.Println("the cause of cancel is: ", ctx02.Err())
 }
 println(runtime.NumGoroutine())
 println("main program exit!!!!")
}

WithValue

一些必需的元數(shù)據(jù)也可以通過上下文傳遞,該上下文將附加到上下文中以供使用。元數(shù)據(jù)作為鍵值傳遞,但請注意,鍵必須具有可比性,并且值必須是線程安全的。

package main
import (
 "runtime"
 "fmt"
 "time"
 "context"
)
func monitor(ctx context.Context, index int) {
 for {
  select {
  case - ctx.Done():
   // this branch is only reached when the ch channel is closed, or when data is sent(either true or false)
   fmt.Printf("monitor %v, end of monitoring. \n", index)
   return
  default:
   var value interface{} = ctx.Value("Nets")
   fmt.Printf("monitor %v, is monitoring %v\n", index, value)
   time.Sleep(2 * time.Second)
  }
 }
}
func main() {
 var ctx01 context.Context = nil
 var ctx02 context.Context = nil
 var cancel context.CancelFunc = nil
 ctx01, cancel = context.WithCancel(context.Background())
 ctx02, cancel = context.WithTimeout(ctx01, 1 * time.Second)
 var ctx03 context.Context = context.WithValue(ctx02, "Nets", "Champion") // key: "Nets", value: "Champion"

 defer cancel()
 for i := 1; i = 5; i = i + 1 {
  go monitor(ctx03, i)
 }
 time.Sleep(5 * time.Second)
 if ctx02.Err() != nil {
  fmt.Println("the cause of cancel is: ", ctx02.Err())
 }
 println(runtime.NumGoroutine())
 println("main program exit!!!!")
}

關(guān)于上下文,還有一些注意事項(xiàng):不要將Context存儲(chǔ)在結(jié)構(gòu)類型中,而是將Context明確傳遞給需要它的每個(gè)函數(shù),并且Context應(yīng)該是第一個(gè)參數(shù)。

即使函數(shù)允許,也不要傳遞nil Context,或者如果您不確定要使用哪個(gè)Context,請傳遞context。不要將可能作為函數(shù)參數(shù)傳遞給上下文值的變量傳遞。

到此這篇關(guān)于golang中context的作用的文章就介紹到這了,更多相關(guān)golang中context的作用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • GoLang之使用Context控制請求超時(shí)的實(shí)現(xiàn)
  • golang通過context控制并發(fā)的應(yīng)用場景實(shí)現(xiàn)
  • GOLANG使用Context實(shí)現(xiàn)傳值、超時(shí)和取消的方法
  • GOLANG使用Context管理關(guān)聯(lián)goroutine的方法
  • 深入Golang之context的用法詳解

標(biāo)簽:安康 儋州 電子產(chǎn)品 青海 物業(yè)服務(wù) 海南 遼寧 西雙版納

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang中context的作用詳解》,本文關(guān)鍵詞  golang,中,context,的,作用,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang中context的作用詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang中context的作用詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    玉足女爽爽91| 日韩欧美在线国产| 嫩模私拍啪啪| 一本色道久久综合亚洲精品婷婷| 18禁裸男晨勃露j毛免费观看| 成人精品福利| 欧美三电影在线| 台湾佬中文娱乐久久久| 精品av综合导航| 国产精品秘入口| 亚洲一区在线看| 手机在线免费观看毛片| a'aaa级片在线观看| 久久国产剧场电影| 最新不卡av在线| 中国日韩欧美久久久久久久久| 男人的天堂视频网站| 久久久久久毛片免费看| 国产又粗又大又爽视频| 亚洲综合激情网| 久草视频免费在线播放| 亚洲无人区码一码二码三码的含义| 亚洲第一免费看片| 影音先锋人妻啪啪av资源网站| 亚洲欧美日韩在线综合| 香港三级韩国三级日本三级| 夜夜骚av一区二区三区| 秋霞av一区二区三区| 亚洲成av人**亚洲成av**| 蜜桃av一区二区在线观看| 春意影院午夜免费入口| 久久久综合香蕉尹人综合网| 亚洲一级片在线播放| 久久久国产91| 久久激情视频免费观看| 久久精品无码一区二区日韩av| 欧美色图第二页| 秘密基地免费观看完整版中文| 尤物视频免费| 色综合久久天天综合网| 成人动漫免费在线观看| 国产区精品区| 国产精品福利在线| 久久美女高清视频| 激情综合网俺也去| 中文字幕在线免费视频| 加勒比久久高清| 91精品国产综合久久国产大片| 不卡av在线网| 日本一本在线免费福利| 九九免费精品视频| 中文字幕亚洲视频| 日本黄色www| 久久不射2019中文字幕| 午夜欧美一区二区三区在线播放| 国产不卡在线播放| 国产一区二区三区四区五区六区| 精品国产午夜肉伦伦影院| 日韩免费电影一区| 人妻 日韩 欧美 综合 制服| 精品美女在线观看视频在线观看| 中文字幕日韩综合| 中文在线不卡| 第一会所亚洲原创| 免费看黄色的网站| 日韩美女黄色片| 成人在线免费播放视频| 日本韩国一区二区三区| 日韩av在线播放网址| 欧美aaa级| gogo人体一区| 欧美日韩激情视频一区二区三区| 免费在线成人av| 成人在线免费高清视频| 国产又粗又猛又黄| 国产又大又黄视频| 中文av一区二区| 日韩欧美专区| 欧美日韩国产在线观看网站| 在线免费观看污| 三级影片在线观看欧美日韩一区二区| 国产美女情趣调教h一区二区| 欧美日本三级| 午夜剧场日韩| 日韩男女性生活视频| 99精品免费网| 日韩人妻无码精品久久久不卡| 手机在线中文字幕| 久久精品国产亚洲aⅴ| 2021国产在线| 国产伦精品免费视频| 亚洲娇小娇小娇小| 高清不卡日本v二区在线| 巨骚激情综合| 亚洲欧美一区二区三区在线播放| 东方aⅴ免费观看久久av| 干出白浆视频| 亚洲国模精品一区| 在线精品播放av| 国产精品久久久久久久久毛片| 色一区二区三区四区| 国产伦精品一区二区三区免费视频| 小次郎av收藏家| 激情小说亚洲一区| 老牛嫩草一区二区三区日本| 欧美丰满熟妇bbbbbb| 日韩欧美精品在线视频| 色综合色综合网色综合| 国产综合久久久久影院| 99热在线免费| 神马影院午夜我不卡| 亚洲高清123| 免费在线观看av网站| 激情综合闲人网| 日韩av片在线| 日韩专区一卡二卡| 电影eeuss影院www| 99久久久久久99| 91网站在线观看免费| 日韩午夜激情免费电影| 免费激情视频网站| 性欧美大胆高清视频| 播五月开心婷婷综合| 国产农村妇女aaaaa视频| 99国产精品久久一区二区三区| 26uuu另类欧美亚洲曰本| 日韩av加勒比| 欧美一区深夜视频| 欧美一级鲁丝片| 色88888久久久久久影院野外| www.色小姐com| 免费三级欧美电影| 久久电影视频| 一区二区三区成人在线视频| bdsm在线观看播放视频| 成年人免费视频观看| 日韩欧美性视频| 亚洲精品影视在线观看| 色戒汤唯在线观看| 麻豆九一精品爱看视频在线观看免费| 国产精品久久网| 久久国产精品高清一区二区三区| 伊人网伊人影院| 黄a免费视频| 国产综合亚洲精品一区二| 97精品久久久中文字幕免费| 日本亚洲色大成网站www久久| 国产精品高潮呻吟久久久| 欧美做爰性生交视频| 亚洲精品一卡二卡| 亚洲精品在线观看免费| 成人国产一区二区三区| 日韩欧美色电影| 欧美视频二区36p| 在线免费a视频| 亚洲综合中文字幕在线| 欧美成人二区| 蜜臀av一区二区三区有限公司| 久久天堂影院| 国产99在线 | 亚洲| 国产寡妇树林野战在线播放| 欧美四级剧情无删版影片| 日韩欧美a级成人黄色| 亚洲码无人客一区二区三区| 国产精品一区二区久激情瑜伽| 成人毛片100部免费看| 在线天堂资源| 秋霞一区二区三区| 亚洲国产精品天堂| 天堂8在线视频| 97视频精彩视频在线观看| 国模冰冰炮一区二区| 亚洲人成色777777老人头| 午夜精品在线| 伊人久久中文字幕| 国产精品www网站| 高清不卡一区二区在线| 国产精品久久久久7777| 中文字幕21页在线看| 日韩乱码人妻无码中文字幕| 69xxx在线| 亚洲女同志freevdieo| 日韩精品一线二线三线| 九色porny蝌蚪视频在线观看| 激情欧美一区二区三区| 中文字幕中文字幕中文字幕亚洲无线| 成人黄色三级视频| 国产成人精品www牛牛影视| 国产精品日韩在线一区| 国产经典中年夫妇盗摄| 亚洲人成人77777线观看| 九色视频在线播放| 日韩一区二区电影在线观看| 91精品秘密在线观看| 久久久亚洲av波多野结衣| 在线观看国产精品淫| 国产精品系列视频| 无码一区二区三区在线观看| 国产精品一区而去| 欧美性猛交xxx乱大交3蜜桃| 日本强好片久久久久久aaa| 中文字幕一区二区三区四区五区六区| 天天干天天干天天干天天干天天干| 一色屋色费精品视频在线观看| 黄色大片免费观看| 久热国产精品视频一区二区三区| 国产一区二区三区四区五区3d| 波多野结衣一区二区三区在线| 韩国成人在线视频| 亚洲国产精品www| 亚洲欧美欧美一区二区三区| av电影不卡在线观看| 成人做爰69片免费| 久久久久久99| 狠狠色综合欧美激情| 色婷五月综激情亚洲综合| 日韩中文字幕一区二区高清99| 国产精品bbw一区二区三区| 久久国产精品72免费观看| 成人香蕉社区| 一级特黄大欧美久久久| 亚洲我射av| 少妇激情av一区二区三区| 老司机午夜精品| 国产91福利| 国产精品丝袜白浆摸在线| 91高清国产| 欧美在线亚洲| 亚洲一区二区三| 成年人深夜福利| 丝袜美腿小色网| 韩国中文字幕在线| 男人天堂va| 好吊妞视频一区二区三区| 免费黄色一级网站| 欧美激情在线视频二区| 欧洲一区二区日韩在线视频观看免费| 国产裸体舞一区二区三区| 日韩欧美在线视频一区二区| 99免费看香蕉视频| 日韩欧美另类中文字幕| 求av网址在线观看| 一本久道久久综合婷婷鲸鱼| 日产精品久久久久久久蜜臀| 成人黄页在线观看| 亚洲精品tv久久久久久久久久| 欧美金发大战黑人最粗videos| 国产婷婷一区二区三区久久| 亚洲自拍偷拍区| 国产小视频你懂的| 蜜桃av噜噜一区二区三区小说| 欧美videos粗暴高清性| 日韩成人av毛片| 色拍拍在线精品视频8848| av爱爱亚洲一区| 粉嫩一区二区三区四区公司1| 黄网站免费在线播放| 国产人妻一区二区| 国产美女久久久| 91精品中文字幕一区二区三区| 中文字幕一区二区三区四| 久久久久亚洲综合| 激情深爱综合网| 青青视频一区二区| 亚洲va国产va欧美va观看| 欧美日韩播放| 欧美综合一区| 国产免费av高清在线| 国产精品午夜春色av| 国产精品视频一区二区三区经| 精品乱人伦小说| 国精产品视频一二二区| 日韩av专区| 日韩国产欧美区| 狠狠色狠狠色综合日日五| 九九热这里只有| 这里只有精品视频| 国精产品一区一区二区三区mba| 亚洲国产精品热久久| 免费久久99精品国产自在现线| 成人国产在线观看| 中文在线8资源库| 亚洲视频在线一区| 欧美亚洲禁片免费| 国产视频精品免费播放| 懂色av一区二区在线播放| vam成人资源在线观看| eeuss影院18www免费| 国精品日韩欧美一区二区三区| 中文字幕欧美视频在线| 国产精品电影一区二区| 亚洲人成色777777老人头| 免费视频亚洲| 国产精品久久亚洲不卡| 国产亚洲第一区| 久久亚洲精品中文字幕蜜潮电影| 8x8ⅹ国产精品一区二区二区| 在线免费观看高清视频色| 一区二区三区四区国产精品| 亚洲激情在线观看| 国内综合精品午夜久久资源| 亚洲精品按摩视频| 国产午夜在线播放| 精品少妇一区二区| 午夜免费啪视频观看视频| 26uuuu精品一区二区| 日日干日日操| a黄色在线观看| 91麻豆精品国产91久久久久| 国产色综合久久| 国产又大又长又粗| 精品黑人一区二区三区| 伊人久久在线观看| 欧美国产一区二区三区激情无套| 国产成人精品一区二区三区网站观看| 精品极品在线| 久草精品在线| 婷婷综合视频| 国产精品黑丝在线播放| 精品国产av一区二区| 一区二区三区在线播放欧美| 精品极品三级久久久久| 国产精品久久久99| 新67194成人永久网站| 久久影院视频免费| 午夜久久99| www.日本一区| 精品国产乱码久久久久久1区2匹|