欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > golang通過context控制并發的應用場景實現

golang通過context控制并發的應用場景實現

熱門標簽:濮陽自動外呼系統代理 廣東語音外呼系統供應商 賺地圖標注的錢犯法嗎 智能電銷機器人營銷 地圖標注測試 福州鐵通自動外呼系統 長沙ai機器人電銷 澳門防封電銷卡 烏魯木齊人工電銷機器人系統

golang 里出現多 goroutine 的場景很常見, 最常用的兩種方式就是 WaitGroup 和 Context, 今天我們了解一下 Context 的應用場景

使用場景

場景一: 多goroutine執行超時通知

并發執行的業務中最常見的就是有協程執行超時, 如果不做超時處理就會出現一個僵尸進程, 這累計的多了就會有一陣手忙腳亂了, 所以我們要在源頭上就避免它們

看下面這個示例:

package main

import (
 "context"
 "fmt"
 "time"
)

/**
同一個content可以控制多個goroutine, 確保線程可控, 而不是每新建一個goroutine就要有一個chan去通知他關閉
有了他代碼更加簡潔
*/

func main() {
 fmt.Println("run demo \n\n\n")
 demo()
}

func demo() {
 ctx, cancel := context.WithTimeout(context.Background(), 9*time.Second)
 go watch(ctx, "[線程1]")
 go watch(ctx, "[線程2]")
 go watch(ctx, "[線程3]")

 index := 0
 for {
  index++
  fmt.Printf("%d 秒過去了 \n", index)
  time.Sleep(1 * time.Second)
  if index > 10 {
   break
  }
 }

 fmt.Println("通知停止監控")
 // 其實此時已經超時, 協程已經提前退出
 cancel()

 // 防止主進程提前退出
 time.Sleep(3 * time.Second)
 fmt.Println("done")
}

func watch(ctx context.Context, name string) {
 for {
  select {
  case -ctx.Done():
   fmt.Printf("%s 監控退出, 停止了...\n", name)
   return
  default:
   fmt.Printf("%s goroutine監控中... \n", name)
   time.Sleep(2 * time.Second)
  }
 }
}

使用 context.WithTimeout() 給文本流設置一個時間上限, 結合 for+select 去接收消息. 當執行超時,或手動關閉都會給 -ctx.Done() 發送消息,而且所有使用同一個 context 都會收到這個通知, 免去了一個一個通知的繁瑣代碼

場景二: 類似web服務器中的session

比如在php中(沒用swoole擴展), 一個請求進來, 從 $_REQUEST $_SERVER 能獲取到的是有關這一條請求的所有信息, 哪怕是使用全局變量也是給這一個請求來服務的, 是線程安全的

但是 golang 就不一樣了, 因為程序本身就能起一個 web sever, 因此就不能隨便使用全局變量了, 不然就是內存泄露警告. 但是實際業務當中需要有一個類似session 的東西來承載單次請求的信息, 舉一個具體的例子就是: 給每次請求加一個 uniqueID 該如何處理? 有了這個 uniqueID, 請求的所有日志都能帶上它, 這樣排查問題的時候方便追蹤一次請求發生了什么

如下:

func demo2() {
 pCtx, pCancel := context.WithCancel(context.Background())
 pCtx = context.WithValue(pCtx, "parentKey", "parentVale")
 go watch(pCtx, "[父進程1]")
 go watch(pCtx, "[父進程2]")

 cCtx, cCancel := context.WithCancel(pCtx)
 go watch(cCtx, "[子進程1]")
 go watch(cCtx, "[子進程2]")
 fmt.Println(pCtx.Value("parentKey"))
 fmt.Println(cCtx.Value("parentKey"))

 time.Sleep(10 * time.Second)
 fmt.Println("子進程關閉")
 cCancel()
 time.Sleep(5 * time.Second)
 fmt.Println("父進程關閉")
 pCancel()

 time.Sleep(3 * time.Second)
 fmt.Println("done")
}

最開始的 context.WithCancel(context.Background()) 中 context.Background() 就是一個新建的 context, 利用 context 能繼承的特性, 可以將自己的程序構建出一個 context 樹, context 執行 cancel() 將影響到當前 context 和子 context, 不會影響到父級.

同時 context.WithValue 也會給 context 帶上自定義的值, 這樣 uniqueID 就能輕松的傳遞了下去, 而不是一層層的傳遞參數, 改func什么的

對于 context 很值得參考的應用有:

  • Gin
  • logrus

Context 相關 func 和接口

繼承 context 需要實現如下四個接口

type Context interface {
 Deadline() (deadline time.Time, ok bool)

 Done() -chan struct{}

 Err() error

 Value(key interface{}) interface{}
}

當使用的時候不需要實現接口, 因為官方包里已經基于 emptyCtx 實現了一個, 調用方法有

var (
 background = new(emptyCtx)
 todo  = new(emptyCtx)
)

// 這個是最初始的ctx, 之后的子ctx都是繼承自它
func Background() Context {
 return background
}

// 不清楚context要干嘛, 但是就得有一個ctx的用這個
func TODO() Context {
 return todo
}

繼承用的函數

func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
func WithValue(parent Context, key, val interface{}) Context
  • WithCancel 返回一個帶 cancel 函數的ctx,
  • WithDeadline 在到達指定時間時自動執行 cancel()
  • WithTimeout 是 WithDeadline的殼子, 區別就是這個函數是多少時間過后執行 cancel
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {
 return WithDeadline(parent, time.Now().Add(timeout))
}

WithValue 繼承父類ctx時順便帶上一個值

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

您可能感興趣的文章:
  • 快速解決Golang Map 并發讀寫安全的問題
  • 淺談golang并發操作變量安全的問題
  • golang高并發限流操作 ping / telnet
  • golang gin 框架 異步同步 goroutine 并發操作
  • Golang 實現分片讀取http超大文件流和并發控制
  • golang-gin-mgo高并發服務器搭建教程
  • golang 限制同一時間的并發量操作
  • golang并發編程的實現
  • Golang 并發以及通道的使用方式

標簽:太原 阿克蘇 廣西 調研邀請 西雙版納 貴陽 德州 慶陽

巨人網絡通訊聲明:本文標題《golang通過context控制并發的應用場景實現》,本文關鍵詞  golang,通過,context,控制,并發,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang通過context控制并發的應用場景實現》相關的同類信息!
  • 本頁收集關于golang通過context控制并發的應用場景實現的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    久久激情五月激情| av最新在线观看| 精品视频一区二区三区免费| 国产精品美女久久久久av爽李琼 | 中文字幕第一区第二区| 久久精品国产一区二区三 | 国精产品视频一二二区| 亚洲精品在线免费观看视频| 日韩国产在线观看一区| 国产精品嫩草av| 欧美一区二区日韩| 日韩精品欧美精品| av在线网站观看| 欧美电影免费观看完整版| 蜜桃精品在线观看| 欧洲女同同性吃奶| 久久婷婷成人综合色| 国产一区二区免费看| 中文字幕91视频| 中文字幕精品三区| 99在线精品观看| 欧日韩精品视频| 亚洲午夜久久久| 精品1卡二卡三卡四卡老狼| 91精品国产综合久久久久久久久久 | 欧美精品三级日韩久久| 亚洲成人综合视频| 超碰97人人干| 国产日产欧美一区二区三区| 东方aⅴ免费观看久久av| 91成人免费网站| 亚洲高清免费视频| 一级性生活毛片| 久久久久久黄色| 国产69精品久久久久毛片| 麻豆精品一区二区三区视频| 一区二区三国产精华液| 黄色片视频免费观看| 久久蜜桃av一区精品变态类天堂 | 91精品福利在线一区二区三区| 午夜精品久久一牛影视| 国产成人精品无码免费看夜聊软件| 久久久午夜电影| a级精品国产片在线观看| 欧美电影在线免费观看| 看片的网站亚洲| 国产这里有精品| 午夜精品在线看| 爱爱免费小视频| 国产精品久久久久四虎| 日本中文字幕有码| 精品国偷自产国产一区| 丁香一区二区三区| 91精品国产一区二区| 国产寡妇亲子伦一区二区| 欧美在线一二三| 久久精品理论片| 日本韩国一区二区三区视频| 肉肉av福利一精品导航| 国产小视频你懂的| 亚洲成人黄色小说| 波兰性xxxxx极品hd| 亚洲成人你懂的| 貂蝉被到爽流白浆在线观看| 亚洲国产精品久久艾草纯爱| 亚洲无人区码一码二码三码的含义| 亚洲免费视频成人| 国产精品20p| 亚洲亚洲人成综合网络| 中文字幕91视频| 五月婷婷综合网| 欧美偷拍第一页| 青青草97国产精品免费观看无弹窗版| 国产三级国产精品国产国在线观看| 日韩成人免费看| 日本国产一区二区| 精品亚洲成a人| 欧美日韩国产影片| 成人午夜碰碰视频| 欧美成人a∨高清免费观看| 成人av在线网| 久久夜色精品国产噜噜av| 中国男女全黄大片| 国产精品嫩草影院av蜜臀| 右手影院亚洲欧美| 夜夜揉揉日日人人青青一国产精品| 欧美老女人性生活视频| 视频一区二区国产| 欧美综合天天夜夜久久| 国产成人av一区二区三区在线观看| 欧美一卡2卡3卡4卡| 91免费版pro下载短视频| 亚洲国产精华液网站w| 毛片网站免费观看| 亚洲丰满少妇videoshd| 色94色欧美sute亚洲13| 国产成人精品亚洲日本在线桃色 | 久久爱一区二区| 久久精品久久精品| 日韩一级黄色片| 亚洲v在线观看| 亚洲区小说区图片区qvod| 国产探花视频在线| 黑人巨大精品欧美黑白配亚洲 | 国产人妻精品久久久久野外| 欧美—级在线免费片| 人人人妻人人澡人人爽欧美一区| 午夜精品久久久久久久| 欧美亚洲综合网| 99国产欧美久久久精品| 中文字幕制服丝袜成人av| 国产精品18在线| 国内欧美视频一区二区| 精品美女被调教视频大全网站| 男人网站在线观看| 亚洲第一会所有码转帖| 精品视频一区二区三区免费| 91美女视频网站| 亚洲精品视频一区| 在线精品视频免费播放| av爱爱亚洲一区| 亚洲图片激情小说| 色综合久久99| 99精品视频在线播放观看| 综合久久久久久久| 色综合久久综合网| 国产蜜臀av在线一区二区三区| 亚洲午夜福利在线观看| 免费成人av资源网| 欧美变态口味重另类| 视频一区国产视频| 欧美一区二区在线免费播放 | 自拍偷拍亚洲欧美日韩| 少妇影院在线观看| 91在线视频网址| 一二三区精品视频| 在线成人av网站| 毛茸茸多毛bbb毛多视频| 美美哒免费高清在线观看视频一区二区 | 国产精品久久久久久久无码| 天天色天天操综合| 日韩视频免费观看高清完整版在线观看 | xf在线a精品一区二区视频网站| 性欧美一区二区| 国产精品小仙女| 最近中文字幕一区二区三区| 欧美吞精做爰啪啪高潮| www男人天堂| 美脚の诱脚舐め脚责91 | 欧美r级电影在线观看| 亚洲久久久久久久| 国产福利一区二区三区| 亚洲欧美国产三级| 538在线一区二区精品国产| 久久精品老司机| 国产高清亚洲一区| 一区二区三区资源| 日韩一区二区高清| 国产精品情侣呻吟对白视频| 成人听书哪个软件好| 亚洲在线观看免费| 精品国产乱码久久| 欧美丰满熟妇bbbbbb| 91超薄肉色丝袜交足高跟凉鞋| 免费高清不卡av| 国产精品美女久久久久av爽李琼 | 黄色国产在线观看| 国产伦精一区二区三区| 亚洲麻豆国产自偷在线| 欧美一级在线视频| 九九精品视频免费| 娇妻高潮浓精白浆xxⅹ| 激情深爱一区二区| 亚洲女同女同女同女同女同69| 91精品国产91久久久久久一区二区 | jizz日本免费| 国产91在线看| 亚洲6080在线| 国产人久久人人人人爽| 欧美性受xxxx黑人xyx性爽| 搡老熟女老女人一区二区| 成人蜜臀av电影| 天堂精品中文字幕在线| 国产精品无码永久免费888| 在线不卡欧美精品一区二区三区| 成人一级片免费看| 国产女主播在线播放| 国产精品自在在线| 五月激情综合网| 国产精品国产自产拍高清av| 欧美一区二区精品在线| 国产一区二区视频在线观看免费| 国产又粗又长又爽| 成人精品免费视频| 裸体一区二区三区| 亚洲精品成a人| 久久久九九九九| 欧美久久高跟鞋激| 永久久久久久久| 无码人妻精品一区二区中文|