校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > golang通過context控制并發(fā)的應(yīng)用場景實現(xiàn)

golang通過context控制并發(fā)的應(yīng)用場景實現(xiàn)

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

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

使用場景

場景一: 多goroutine執(zhí)行超時通知

并發(fā)執(zhí)行的業(yè)務(wù)中最常見的就是有協(xié)程執(zhí)行超時, 如果不做超時處理就會出現(xiàn)一個僵尸進程, 這累計的多了就會有一陣手忙腳亂了, 所以我們要在源頭上就避免它們

看下面這個示例:

package main

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

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

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("通知停止監(jiān)控")
 // 其實此時已經(jīng)超時, 協(xié)程已經(jīng)提前退出
 cancel()

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

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

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

場景二: 類似web服務(wù)器中的session

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

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

如下:

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("子進程關(guān)閉")
 cCancel()
 time.Sleep(5 * time.Second)
 fmt.Println("父進程關(guān)閉")
 pCancel()

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

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

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

對于 context 很值得參考的應(yīng)用有:

  • Gin
  • logrus

Context 相關(guān) func 和接口

繼承 context 需要實現(xiàn)如下四個接口

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

 Done() -chan struct{}

 Err() error

 Value(key interface{}) interface{}
}

當(dāng)使用的時候不需要實現(xiàn)接口, 因為官方包里已經(jīng)基于 emptyCtx 實現(xiàn)了一個, 調(diào)用方法有

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

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

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

繼承用的函數(shù)

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 函數(shù)的ctx,
  • WithDeadline 在到達指定時間時自動執(zhí)行 cancel()
  • WithTimeout 是 WithDeadline的殼子, 區(qū)別就是這個函數(shù)是多少時間過后執(zhí)行 cancel
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {
 return WithDeadline(parent, time.Now().Add(timeout))
}

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標題《golang通過context控制并發(fā)的應(yīng)用場景實現(xiàn)》,本文關(guān)鍵詞  golang,通過,context,控制,并發(fā),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang通過context控制并發(fā)的應(yīng)用場景實現(xiàn)》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang通過context控制并發(fā)的應(yīng)用場景實現(xiàn)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    日韩国产欧美在线观看| 色悠悠久久综合| 99久久精品国产精品久久| 欧美亚洲禁片免费| 26uuu亚洲| 天堂av在线一区| 成人黄色a**站在线观看| 日韩精品专区在线影院观看| 亚洲日本在线天堂| 国产成人啪免费观看软件| 在线91免费看| 亚洲成人av福利| 99精品视频中文字幕| 国产午夜三级一区二区三| 日日嗨av一区二区三区四区| 在线精品视频小说1| 久久久久亚洲蜜桃| 韩国欧美国产1区| 欧美一卡二卡在线观看| 亚洲一区二区三区影院| 色婷婷一区二区| 国产精品传媒入口麻豆| 成人手机电影网| 亚洲国产成人私人影院tom| 成人激情动漫在线观看| 国产偷v国产偷v亚洲高清 | 这里只有精品视频在线观看| 亚洲欧美aⅴ...| 91视频观看视频| 中文字幕五月欧美| a4yy欧美一区二区三区| 国产精品传媒入口麻豆| 9色porny自拍视频一区二区| 国产区在线观看成人精品| 国产精品1024久久| 中文在线一区二区 | 337p粉嫩大胆色噜噜噜噜亚洲| 日本成人在线电影网| 91麻豆精品国产91久久久资源速度| 亚洲第一二三四区| 欧美一区二区在线免费观看| 亚洲成a人v欧美综合天堂| 制服丝袜激情欧洲亚洲| 日本不卡不码高清免费观看| 欧美一区二区免费| 韩国视频一区二区| 国产清纯白嫩初高生在线观看91 | 日韩精品资源二区在线| 国产一二三精品| 中文久久乱码一区二区| 91视频国产资源| 日韩专区欧美专区| 精品剧情v国产在线观看在线| 国产精品18久久久久久久久久久久| 久久久久久久久久电影| 成人av集中营| 婷婷激情综合网| 精品国产sm最大网站| 国产999精品久久久久久| 亚洲欧洲av在线| 欧美精品一二三区| 国产一区二区三区在线看麻豆| 国产精品美女久久久久aⅴ国产馆| 99re成人精品视频| 人妖欧美一区二区| 中文字幕一区在线| 欧美日韩国产小视频| 国产很黄免费观看久久| 一区二区三区不卡在线观看 | 亚洲精品中文在线影院| 337p亚洲精品色噜噜| 成人免费毛片高清视频| 亚洲成人先锋电影| 日本一区二区视频在线观看| 91久久精品国产91性色tv| 蜜臀av一区二区在线免费观看| 国产精品免费视频网站| 日韩亚洲欧美成人一区| 91麻豆国产香蕉久久精品| 久久精品国产精品亚洲红杏| 亚洲天堂精品在线观看| 精品国产一区二区精华| 91精品福利视频| 波多野结衣欧美| 蜜桃av噜噜一区| 亚洲综合无码一区二区| 中文字幕精品综合| 欧美mv和日韩mv的网站| 欧美日韩高清一区二区三区| 国产黄色精品视频| 久久国产精品第一页| 亚洲综合色视频| 亚洲婷婷国产精品电影人久久| 精品国产乱码久久| 91精品久久久久久蜜臀| 北条麻妃国产九九精品视频| 国产综合成人久久大片91| 日韩高清不卡在线| 一区二区三区在线观看视频| 中文字幕中文乱码欧美一区二区 | 国产三级欧美三级日产三级99| 欧美日韩免费视频| 91香蕉视频在线| k8久久久一区二区三区| 国产成人丝袜美腿| 国产一区二区精品久久99| 蜜臀av性久久久久av蜜臀妖精 | 欧美日韩性生活| 色视频欧美一区二区三区| 成人精品亚洲人成在线| 国产成人精品午夜视频免费| 国产一区999| 国产美女精品在线| 国产精品影音先锋| 国产精品香蕉一区二区三区| 国产一区激情在线| 国产精品影音先锋| 国产69精品久久久久毛片| 国产99精品在线观看| 成人午夜av影视| 97久久精品人人澡人人爽| 99热国产精品| 色婷婷综合久久久中文一区二区| 色综合视频在线观看| 色综合久久久网| 欧美特级限制片免费在线观看| 欧美亚洲综合另类| 欧美三级中文字幕| 欧美日韩不卡在线| 精品奇米国产一区二区三区| 日韩精品一区在线| 精品国免费一区二区三区| 午夜激情一区二区| 蜜桃视频一区二区三区在线观看| 奇米一区二区三区av| 精品中文字幕一区二区| 国产盗摄精品一区二区三区在线| 本田岬高潮一区二区三区| 色94色欧美sute亚洲13| 欧美一区二区在线免费观看| 久久免费视频色| 一区二区三区四区国产精品| 日韩成人免费电影| 国产精品一区专区| 一本色道久久综合亚洲精品按摩| 欧美午夜精品一区二区三区| 日韩一级免费观看| 国产精品青草久久| 亚洲成人久久影院| 国内成人免费视频| 色婷婷精品大在线视频 | 91啪在线观看| 欧美精品在线视频| 国产午夜精品久久| 亚洲国产成人porn| 久久99精品视频| 91在线视频免费91| 欧美一区二区三区四区久久| 久久精品男人的天堂| 亚洲网友自拍偷拍| 国产成人午夜精品5599| 在线综合视频播放| 亚洲欧美在线高清| 久草精品在线观看| 不卡欧美aaaaa| 日韩欧美在线影院| 亚洲综合男人的天堂| 国产精品白丝av| 欧美日韩高清不卡| 亚洲色图20p| 成人av在线播放网址| 精品三级在线看| 亚洲成人av一区| 色琪琪一区二区三区亚洲区| 欧美极品aⅴ影院| 精品一区二区三区在线视频| 欧美日韩国产首页在线观看| 亚洲欧美电影一区二区| 国产99久久久国产精品潘金| 精品精品国产高清a毛片牛牛| 三级亚洲高清视频| 久久午夜老司机| 男女男精品视频网| 欧美另类高清zo欧美| 亚洲男人天堂av| 91色在线porny| 亚洲三级视频在线观看| 成人av在线网| 国产精品国产三级国产a| 国产成人免费在线视频| 欧美精品一区二区三区视频 | 亚洲一区二区视频在线| 色婷婷久久久亚洲一区二区三区| 中国av一区二区三区| 国产suv精品一区二区6| 久久久99久久精品欧美| 国产一区二区不卡在线| 久久噜噜亚洲综合| 国产成人一区在线| 国产精品久久久久久久久果冻传媒|