婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 使用Golang的Context管理上下文的方法

使用Golang的Context管理上下文的方法

熱門標簽:地圖標注的汽車標 高德地圖標注口訣 學海導航地圖標注 南通如皋申請開通400電話 廣州呼叫中心外呼系統 中國地圖標注省會高清 浙江高速公路地圖標注 西部云谷一期地圖標注 江西轉化率高的羿智云外呼系統

golang 1.7版本中context庫被很多標準庫的模塊所使用,比如net/http和os的一些模塊中,利用這些原生模塊,我們就不需要自己再寫上下文的管理器了,直接調用函數接口即可實現,利用context我們可以實現一些比如請求的聲明周期內的變量管理,執行一些操作的超時等等。

保存上下文對象

這里我們通過一個簡單的例子來看一下如何使用context的特性來實現上下文的對象保存,這里我們寫了一個簡單的http server,具有登錄和退出,狀態檢查路由(檢查用戶是否登錄)

func main(){
  mux:=http.NewServeMux()
  mux.HandleFunc("/",StatusHandler)
  mux.HandleFunc("/login",LoginHandler)
  mux.HandleFunc("/logout",LogoutHandler)
  contextedMux:=AddContextSupport(mux)
  log.Fatal(http.ListenAndServe(":8080",contextedMux))
}

其中的AddContextSupport是一個中間件,用來綁定一個context到原來的handler中,所有的請求都必須先經過該中間件后才能進入各自的路由處理中。具體的實現代碼如下:

func AddContextSupport(next http.Handler)http.Handler{
  return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    log.Println(r.Method, "-", r.RequestURI)
    cookie, _ := r.Cookie("username")
    if cookie != nil {
      ctx := context.WithValue(r.Context(), "username", cookie.Value)
      // WithContext returns a shallow copy of r with its context changed
      // to ctx. The provided ctx must be non-nil.
      next.ServeHTTP(w, r.WithContext(ctx))
    } else {
      next.ServeHTTP(w, r)
    }
  })
}

該中間件可以打印每次請求的方法和請求的url,然后獲得請求的cookie值,如果cookie為空的話則繼續傳遞到對應的路由處理函數中,否則保存cookie的值到Context, 注意這里的Context()是request對象的方法, 將創建一個新的上下文對象(如果context為空),context.WithValue()函數將key和value保存在新的上下文對象中并返回該對象。

其余的路由處理函數代碼如下, 分別用來保存cookie的登錄路由LoginHandler(),還有刪除cookie的退出路由處理函數LogoutHandler()。

func LoginHandler(w http.ResponseWriter,r *http.Request){
  expitation := time.Now().Add(24*time.Hour)
  var username string
  if username=r.URL.Query().Get("username");username==""{
    username = "guest"
  }
  cookie:=http.Cookie{Name:"username",Value:username,Expires:expitation}
  http.SetCookie(w,cookie)
}

func LogoutHandler(w http.ResponseWriter, r *http.Request) {
  expiration := time.Now().AddDate(0, 0, -1)
  cookie := http.Cookie{Name: "username", Value: "alice_cooper@gmail.com", Expires: expiration}
  http.SetCookie(w, cookie)
}

這里我們在請求/login的時候,可以傳遞一個參數username到函數中,比如/login?username=alice , 默認為”guest”用戶. 設置的cookie有效期為1天,刪除的時候我們只需要設置cookie為之前的日期即可。

另外一個關鍵的部分是讀取上下文保存內容的 StatusHandler() 路由處理函數,該函數將調用r.Context()獲得request的上下文,如果我們執行了login后,那我們在中間件中已經設置了該對象,所以請求將查看是否上下文對象中保存了一個名為username的對象,如果有的話則回應一個歡迎頁面。否則告知用戶沒有登錄。

func StatusHandler(w http.ResponseWriter,r *http.Request){

  if username:=r.Context().Value("username"); username!=nil{
    w.WriteHeader(http.StatusOK)
    w.Write([]byte("Hi username:"+username.(string)+"\n"))
  }else{
    w.WriteHeader(http.StatusNotFound)
    w.Write([]byte("Not Logged in"))
  }
}

我們不僅僅可以在上下文中保存簡單的類型,我們可以保存任何類型的數據,因為Value() 返回的對象是一個interface{}對象,所以我們需要轉換一下才能使用。

超時處理

對于簡單的保存和傳遞對象,使用context的確很方便,但是該庫的使用不僅僅是保存變量,還可以創建一個超時和取消的行為,比如說我們web端去請求了其他的資源,但是該資源的處理比較耗時,我們無法預見什么時候能夠返回,如果讓用戶超時的話,實在是不太好,所以我們需要創建一個超時的操作,主動判斷是否超時,然后傳遞一個合適的行為給用戶。

這里我們現在路由中增加一個長期運行的job路由

mux.HandleFunc("/longjob",jobWithCancelHandler)

具體的處理如下,我們的handler會利用WithCancel() 返回一個新的(如果沒有創建)或者原來已保存的上下文,還有一個cancel對象,這個對象可以用來手動執行取消操作。另外我們的url中可以指定這個任務模擬執行的長度,比如/longjob?jobtime=10則代表模擬的任務將會執行超過10秒。 執行任務的函數longRunningCalculation()返回一個chan該chan會在執行時間到期后寫入一個Done字符串。

handler中我們就可以使用select語句監聽兩個非緩存的channel,阻塞直到有數據寫到任何一個channel中。比如代碼中我們設置了超時是5秒,而任務執行10秒的話則5秒到期后ctx.Done()會因為cancel()的調用而寫入數據,這樣該handler就會因為超時退出。否則的話則執行正常的job處理后獲得傳遞的“Done”退出。

func longRunningCalculation(timeCost int)chan string{

  result:=make(chan string)
  go func (){
    time.Sleep(time.Second*(time.Duration(timeCost)))
    result-"Done"
  }()
  return result
}
func jobWithCancelHandler(w http.ResponseWriter, r * http.Request){
  var ctx context.Context
  var cancel context.CancelFunc
  var jobtime string
  if jobtime=r.URL.Query().Get("jobtime");jobtime==""{
    jobtime = "10"
  }
  timecost,err:=strconv.Atoi(jobtime)
  if err!=nil{
    timecost=10
  }
  log.Println("Job will cost : "+jobtime+"s")
  ctx,cancel = context.WithCancel(r.Context())
  defer cancel()

  go func(){
    time.Sleep(5*time.Second)
    cancel()
  }()

  select{
  case -ctx.Done():
    log.Println(ctx.Err())
    return
  case result:=-longRunningCalculation(timecost):
    io.WriteString(w,result)
  }
  return
}

這就是使用context的一些基本方式,其實context還有很多函數這里沒有涉及,比如WithTimeout和WithDeadline等,但是使用上都比較相似,這里就不在舉例。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • GOLANG使用Context實現傳值、超時和取消的方法
  • GOLANG使用Context管理關聯goroutine的方法
  • 深入Golang之context的用法詳解

標簽:許昌 保定 吐魯番 德宏 貴州 東營 曲靖 常州

巨人網絡通訊聲明:本文標題《使用Golang的Context管理上下文的方法》,本文關鍵詞  使用,Golang,的,Context,管理,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《使用Golang的Context管理上下文的方法》相關的同類信息!
  • 本頁收集關于使用Golang的Context管理上下文的方法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品99久久久久久有的能看 | 欧美精品日韩一本| 精品久久国产字幕高潮| 亚洲精品一二三四区| 处破女av一区二区| 久久精品一区蜜桃臀影院| 蜜臀av一级做a爰片久久| 欧美一级二级三级蜜桃| 日本va欧美va精品| 日韩欧美一区电影| 蜜桃av一区二区在线观看| 91精品久久久久久久99蜜桃| 免费观看在线综合| 日韩一区二区三区在线视频| 国产在线观看一区二区| 亚洲精品一线二线三线无人区| 天天操天天综合网| 久久青草欧美一区二区三区| 国产一区二区三区黄视频 | 国产精品99久久久久久久vr| 日韩午夜激情电影| 成人黄色片在线观看| 国产精品久久久久一区| 色又黄又爽网站www久久| 国内一区二区在线| 亚洲一区二区三区视频在线播放| 欧美日韩性生活| 91伊人久久大香线蕉| 青青草原综合久久大伊人精品 | 色诱视频网站一区| 国产黄人亚洲片| 国内欧美视频一区二区| 又紧又大又爽精品一区二区| 日韩午夜av一区| 日韩午夜在线影院| 在线观看网站黄不卡| 91麻豆国产福利精品| 国产寡妇亲子伦一区二区| 蜜桃精品在线观看| 麻豆91在线播放免费| 男人操女人的视频在线观看欧美 | 国产人妖乱国产精品人妖| 欧美日韩aaa| 日韩你懂的在线观看| 日韩欧美区一区二| 久久久av毛片精品| 国产精品久久久久影视| 国产精品传媒在线| 中文字幕一区二区三区蜜月 | 国产欧美日韩精品a在线观看| 日韩欧美国产高清| 欧美精品一区二区三区高清aⅴ | 欧美zozo另类异族| 国产欧美日韩不卡免费| 亚洲欧洲中文日韩久久av乱码| 午夜精品久久久久影视| 精品中文字幕一区二区| 国产一区二区福利| 欧美日韩国产123区| 欧美一区二区三区影视| 亚洲免费成人av| 国产麻豆视频一区| 99在线精品一区二区三区| 欧美肥妇毛茸茸| 亚洲精品国久久99热| 久久成人免费电影| 日韩午夜三级在线| 国产精品久久久久久户外露出 | 欧美成人vps| 国产日韩欧美一区二区三区综合 | 久久99热这里只有精品| 丰满少妇久久久久久久| 在线观看欧美黄色| 精品日产卡一卡二卡麻豆| 国产蜜臀97一区二区三区| 视频精品一区二区| 欧美在线三级电影| 色婷婷国产精品| 亚洲日本免费电影| 91精品福利视频| 久久9热精品视频| 2017欧美狠狠色| 成人一区在线观看| 国产精品久久影院| 欧美日韩一级黄| 久久超碰97中文字幕| 91精品国产色综合久久不卡电影 | 精品国产91洋老外米糕| 极品少妇xxxx偷拍精品少妇| 欧美国产日产图区| 91亚洲永久精品| 久草热8精品视频在线观看| 久久久精品影视| 美腿丝袜亚洲综合| 一区二区视频在线| 国产精品不卡视频| 国产人久久人人人人爽| 久久精品一区四区| 亚洲国产高清在线| 国产精品丝袜在线| 欧美xxxx在线观看| 欧美亚洲一区三区| 国产成人午夜精品影院观看视频 | 欧美做爰猛烈大尺度电影无法无天| 蜜桃视频一区二区| 日产国产欧美视频一区精品| 一区二区三区免费在线观看| 国产精品久久久久四虎| 精品国产免费人成电影在线观看四季 | 中文文精品字幕一区二区| 日韩欧美在线网站| 欧美精品一区二区三区蜜桃视频 | 欧美www视频| 日韩视频一区二区在线观看| 欧美日韩一区二区三区在线看| 国产精品99久久久久久有的能看| 麻豆传媒一区二区三区| 国产激情视频一区二区在线观看 | 日本美女一区二区三区| 免费欧美高清视频| 国产91精品精华液一区二区三区| 风间由美性色一区二区三区| a美女胸又www黄视频久久| 色欲综合视频天天天| 日韩午夜在线观看| 亚洲图片欧美激情| 免费观看30秒视频久久| 国产精品一区专区| 免费高清不卡av| 亚洲欧美激情插| 欧美电影免费提供在线观看| 亚洲人成网站色在线观看| 91精品国产福利在线观看| 日韩国产一二三区| 国产欧美一区二区精品久导航 | 一本色道久久综合亚洲91| 一区二区三区欧美| 精品国产1区2区3区| 91麻豆精东视频| 国产成人在线观看免费网站| 亚洲国产日韩a在线播放性色| 精品国产91久久久久久久妲己 | 亚洲午夜影视影院在线观看| 欧美成人video| 欧美视频一区二区| 成人av网址在线| 国产一区二区三区精品欧美日韩一区二区三区 | 久久99国内精品| 精品一区二区三区蜜桃| 亚洲资源在线观看| 亚洲天堂免费看| 亚洲手机成人高清视频| 久久午夜色播影院免费高清| 欧美一区二区在线免费观看| 日韩精品最新网址| 欧美精品一区二区蜜臀亚洲| 91精品国产福利| 精品国产不卡一区二区三区| 久久色中文字幕| 国产精品久久久久影院色老大 | 国产精品久久久久影院老司 | 色噜噜狠狠色综合欧洲selulu| 亚洲国产精品成人综合色在线婷婷| 韩国女主播一区二区三区| 国产成人在线免费| 日韩欧美123| 免费精品99久久国产综合精品| 91精品91久久久中77777| 久久久久久久久久久99999| 国产精品人人做人人爽人人添| 亚洲美女在线国产| 蜜臀av一区二区在线观看| eeuss国产一区二区三区| 欧美麻豆精品久久久久久| 2024国产精品| 亚洲国产日日夜夜| 成人午夜在线视频| 日韩三级中文字幕| 亚洲成人av在线电影| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 色综合久久中文综合久久牛| 精品少妇一区二区三区在线视频| 久久婷婷综合激情| 日本不卡123| 国产一区在线看| 日韩三级免费观看| 男人的j进女人的j一区| 在线视频你懂得一区二区三区| 欧美一区二区免费| 亚洲一二三四久久| 色美美综合视频| 日韩伦理av电影| 在线亚洲精品福利网址导航| 亚洲愉拍自拍另类高清精品| 91美女在线看| 天涯成人国产亚洲精品一区av| 国产91丝袜在线播放0| 国产精品网站在线播放| 色视频欧美一区二区三区| 亚洲美女免费在线|