go context

type Context interface {

    Deadline() (deadline time.Time, ok bool)

    Done() <-chan struct{}

    Err() error

    Value(key interface{}) interface{}
}

Context接口包含四個方法:

  1. Deadline返回綁定當前context的任務被取消的截止時間庭呜;如果沒有設定期限,將返回ok == false。
  2. Done 當綁定當前context的任務被取消時峡碉,將返回一個關閉的channel鲫寄;如果當前context不會被取消吉执,將返回nil地来。
  3. Err 如果Done返回的channel沒有關閉,將返回nil;如果Done返回的channel已經(jīng)關閉咕宿,將返回非空的值表示任務結束的原因蜡秽。如果是context被取消,Err將返回Canceled芽突;如果是context超時,Err將返回DeadlineExceeded寞蚌。
  4. Value 返回context存儲的鍵值對中當前key對應的值,如果沒有對應的key,則返回nil壹哺。

父節(jié)點Context可以主動通過調(diào)用cancel方法取消子節(jié)點Context艘刚,而子節(jié)點Context只能被動等待。同時父節(jié)點Context自身一旦被取消(如其上級節(jié)點Cancel),其下的所有子節(jié)點Context均會自動被取消笛臣。

有三種創(chuàng)建方法:

// 帶cancel返回值的Context隧饼,一旦cancel被調(diào)用,即取消該創(chuàng)建的context
func WithCancel(parent Context) (ctx Context, cancel CancelFunc) 

// 帶有效期cancel返回值的Context燕雁,即必須到達指定時間點調(diào)用的cancel方法才會被執(zhí)行
func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) 

// 帶超時時間cancel返回值的Context,類似Deadline僧免,前者是時間點捏浊,后者為時間間隔
// 相當于WithDeadline(parent, time.Now().Add(timeout)).
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)

package main

import (
    "context"
    "fmt"
    "log"
    "os"
    "time"
)

var logg *log.Logger

func someHandler() {
    //ctx, cancel := context.WithCancel(context.Background())
    ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(5*time.Second))
    go doStuff(ctx)  //這個協(xié)程有5s的超時時間限制

    //10秒后取消doStuff
    time.Sleep(30 * time.Second)
    logg.Printf("wait")
    cancel()  // cancel被調(diào)用,即取消該創(chuàng)建的ctx

}

//每1秒work一下浊洞,同時會判斷ctx是否被取消了,如果是就退出
func doStuff(ctx context.Context) {
    for {
        time.Sleep(1 * time.Second)
        select {
        case <-ctx.Done():
            logg.Printf("done")
            return
        default:
            logg.Printf("work")
        }
    }
}

func main() {
    logg = log.New(os.Stdout, "", log.Ltime)
    someHandler()
    logg.Printf("down")
}

以上執(zhí)行結果:可以看出doStuff在5s之后執(zhí)行結束(超時時間限制)法希,context的cancel是在30s之后

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末靶瘸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子著觉,更是在濱河造成了極大的恐慌惊暴,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肄鸽,死亡現(xiàn)場離奇詭異油啤,居然都是意外死亡,警方通過查閱死者的電腦和手機益咬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梅鹦,“玉大人,你說我怎么就攤上這事齐唆。” “怎么了箍邮?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵锭弊,是天一觀的道長。 經(jīng)常有香客問我味滞,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任攒暇,我火速辦了婚禮,結果婚禮上形用,老公的妹妹穿的比我還像新娘证杭。我一直安慰自己,他們只是感情好解愤,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奸笤,像睡著了一般哼鬓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上异希,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機與錄音扣癣,去河邊找鬼。 笑死搏色,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的频轿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼耕赘,長吁一口氣:“原來是場噩夢啊……” “哼膳殷!你這毒婦竟也來了?” 一聲冷哼從身側響起册招,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤勒极,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辱匿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡絮短,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年昨忆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片限府。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡痢缎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出独旷,到底是詐尸還是另有隱情寥裂,我是刑警寧澤案疲,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站褐啡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏低飒。R本人自食惡果不足惜懂盐,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望莉恼。 院中可真熱鬧,春花似錦尿背、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茴晋。三九已至,卻和暖如春诺擅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背烁涌。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留微峰,地道東北人抒钱。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓颜凯,卻偏偏與公主長得像仗扬,于是被迫代替她去往敵國和親症概。 傳聞我的和親對象是個殘疾皇子早芭,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

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

  • 目錄 Context 基本使用方法 Context 使用場景 valueCtx使用示例結構體WithValue c...
    邁莫coding閱讀 516評論 0 1
  • 控制并發(fā)有兩種經(jīng)典的方式:WaitGroup和Context WaitGroup:控制多個Goroutine同時完...
    JunChow520閱讀 665評論 0 2
  • 1 什么是Context 最近在公司分析gRPC源碼募壕,proto文件生成的代碼帜乞,接口函數(shù)第一個參數(shù)統(tǒng)一是ctx c...
    淘小鋪刀仔閱讀 321評論 0 1
  • Go context 在RPC或者Web服務中,當Server端接受一個request的時候黎烈,都會開啟一個額外的g...
    qingshuiting閱讀 8,728評論 0 2
  • context包以及包內(nèi)方法用以維護一組goroutine間的生命周期的截止照棋,以及同生命周期內(nèi)的共享變量本文面向有...
    openex閱讀 817評論 0 1