Go context

Go context

在RPC或者Web服務(wù)中,當(dāng)Server端接受一個(gè)request的時(shí)候罢荡,都會(huì)開啟一個(gè)額外的gorountine來處理內(nèi)容叔锐。有時(shí)候可能會(huì)使用多個(gè)gorountine來處理同一個(gè)request芋哭。如果對(duì)應(yīng)的request被取消或者timeout,就需要所有為這個(gè)request服務(wù)的gorountine被快速回收睬隶。

context解釋更多的是一種上下文

基本方法

  1. 初始化方法

    TODO

    Background

  2. 多種類型的context

    WithCancel

    WithDeadline

    WithTimeout

    WithValue

    deadline和timeout可以通過使用cancel和timer實(shí)現(xiàn)

context接口內(nèi)容

  1. Deadline:返回deadline锣夹,表明對(duì)應(yīng)的context對(duì)應(yīng)的工作需要被cancel。如果返回的ok是false苏潜,那么表明就沒有設(shè)置deadline時(shí)間银萍。

  2. Done:返回一個(gè)channel,當(dāng)work做完以后這個(gè)channel就會(huì)被關(guān)閉窖贤。當(dāng)對(duì)應(yīng)的context被cancel了就會(huì)返回一個(gè)chan砖顷。
    如果done返回是nil表明表明這個(gè)context是不能夠被cancel的。withcancel赃梧,withdeadline滤蝠,withtimeout都有對(duì)應(yīng)的Done的操作。因?yàn)镈one會(huì)返回一個(gè)read chan授嘀,可以用于判斷對(duì)應(yīng)的context是否被cancel物咳,來控制流程。

    //  func Stream(ctx context.Context, out chan<- Value) error {
    //      for {
    //          v, err := DoSomething(ctx)
    //          if err != nil {
    //              return err
    //          }
    //          select {
    //          case <-ctx.Done():
    //              return ctx.Err()
    //          case out <- v:
    //          }
    //      }
    //  }
    
  3. Err

    如果Done沒有被close蹄皱,那么Err返回的都是nil

    如果Done已經(jīng)執(zhí)行了close览闰,那么Err返回的是非nil,返回的Error類型可以根據(jù)具體的情況判斷巷折。就是兩種压鉴,一種是cancel另一個(gè)匯總deadlineExceeded。

  4. Value

    返回與context的key關(guān)聯(lián)的value

使用方法

context的使用一般都是按照層次性的锻拘,這個(gè)層次指的是gorountine的層次油吭。因?yàn)橛锌赡芪覀兪褂枚鄠€(gè)gorountine或者更深層次的gorountine來處理一個(gè)request击蹲。

一般使用的根節(jié)點(diǎn)都是直接使用context.Background

后邊可以與WithCancel,DeadLine婉宰,TimeOut配合使用歌豺。Parent context可以通過cancel fun等來控制其子context的結(jié)束(也對(duì)應(yīng)著子gorountine),并且層層的gorountine需要判斷Done心包。

使用原則

  1. 一般context的生存都為一個(gè)request类咧,當(dāng)request結(jié)束的時(shí)候需要把context銷毀。

  2. 每次創(chuàng)建一個(gè)gorountine蟹腾,要么將當(dāng)前的context傳遞給這個(gè)gorountine或者創(chuàng)建一個(gè)新的context傳遞給gorountine痕惋。

  3. parent context創(chuàng)建子context的時(shí)候,可以獲得一個(gè)cancel fun岭佳,來控制子gorountine的流程血巍。

  4. 當(dāng)子context傳遞到goroutine應(yīng)該監(jiān)控Done對(duì)應(yīng)的channel,如果上層context關(guān)閉珊随,就需要做相應(yīng)的處理。

使用注意

  1. cancel類型的context在使用的最后一定要調(diào)用cancel釋放資源柿隙,不然有可能Done沒有被使用叶洞,導(dǎo)致資源無法被釋放≠餮拢或者parent對(duì)應(yīng)的context Done close了衩辟。所有在代碼中應(yīng)該盡量及早的cancel對(duì)應(yīng)context

使用模式

  1. 控制goroutine的生命周期

    • 主動(dòng)cancel一個(gè)goroutine,通過withcancel生成對(duì)應(yīng)的child context和cancel波附,在一定條件下由于父親goroutine 進(jìn)行cancel調(diào)用
    • Timeout 調(diào)用(不管對(duì)應(yīng)的child goroutine是否結(jié)束都應(yīng)該調(diào)用cancel來釋放資源)通常會(huì)在defer中使用
    • Deadline 調(diào)用

不過控制goroutine聲明周期的方法還可以使用一個(gè) read chan的方式來實(shí)現(xiàn)艺晴,但是select并不知道多久會(huì)返回,所以可以配置waitgroup

  1. 任務(wù)或者請(qǐng)求超時(shí)掸屡,然后中斷啟的所有子任務(wù)的方法

  2. 不同的Goroutine攜帶各自的value變量封寞。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市仅财,隨后出現(xiàn)的幾起案子狈究,更是在濱河造成了極大的恐慌,老刑警劉巖盏求,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抖锥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡碎罚,警方通過查閱死者的電腦和手機(jī)磅废,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荆烈,“玉大人拯勉,你說我怎么就攤上這事。” “怎么了谜喊?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵潭兽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我斗遏,道長(zhǎng)山卦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任诵次,我火速辦了婚禮账蓉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逾一。我一直安慰自己铸本,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布遵堵。 她就那樣靜靜地躺著箱玷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陌宿。 梳的紋絲不亂的頭發(fā)上锡足,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音壳坪,去河邊找鬼舶得。 笑死,一個(gè)胖子當(dāng)著我的面吹牛爽蝴,可吹牛的內(nèi)容都是我干的沐批。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼蝎亚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼九孩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起颖对,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤捻撑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后缤底,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顾患,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年个唧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了江解。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡徙歼,死狀恐怖犁河,靈堂內(nèi)的尸體忽然破棺而出鳖枕,到底是詐尸還是另有隱情,我是刑警寧澤桨螺,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布宾符,位于F島的核電站,受9級(jí)特大地震影響灭翔,放射性物質(zhì)發(fā)生泄漏魏烫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一肝箱、第九天 我趴在偏房一處隱蔽的房頂上張望哄褒。 院中可真熱鬧,春花似錦煌张、人聲如沸呐赡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽链嘀。三九已至,卻和暖如春绎谦,著一層夾襖步出監(jiān)牢的瞬間管闷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工窃肠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刷允。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓冤留,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親树灶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纤怒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 引言 context 是 Go 中廣泛使用的程序包,由 Google 官方開發(fā)天通,在 1.7 版本引入。它用來簡(jiǎn)化在...
    51reboot閱讀 3,501評(píng)論 0 10
  • 控制并發(fā)有兩種經(jīng)典的方式,一種是WaitGroup蛤售,另外一種就是Context WaitGroup的使用 Wait...
    Carrism閱讀 14,128評(píng)論 2 10
  • context包以及包內(nèi)方法用以維護(hù)一組goroutine間的生命周期的截止誓焦,以及同生命周期內(nèi)的共享變量本文面向有...
    openex閱讀 817評(píng)論 0 1
  • 《Go語言四十二章經(jīng)》第三十七章 context包 作者:李驍 37.1 context包 在Go中,每個(gè)請(qǐng)求的r...
    ffhelicopter閱讀 1,384評(píng)論 0 7
  • [TOC] Golang Context分析 Context背景 和 適用場(chǎng)景 golang在1.6.2的時(shí)候還沒...
    AllenWu閱讀 11,521評(píng)論 0 30