亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

GOLANG使用Context管理關聯goroutine的方法

2020-04-01 18:50:15
字體:
來源:轉載
供稿:網友

一般一個業務很少不用到goroutine的,因為很多方法是需要等待的,例如http.Server.ListenAndServe這個就是等待的,除非關閉了Server或Listener,否則是不會返回的。除非是一個API服務器,否則肯定需要另外起goroutine發起其他的服務,而且對于API服務器來說,在http.Handler的處理函數中一般也需要起goroutine,如何管理這些goroutine,在GOLANG1.7提供context.Context。

先看一個簡單的,如果啟動兩個goroutine,一個是HTTP,還有個信號處理的收到退出信號做清理:

wg := sync.WaitGroup{}defer wg.Wait()wg.Add(1)go func() {  defer wg.Done()  ss := make(os.Signal, 0)  signal.Notify(ss, syscall.SIGINT, syscall.SIGTERM)  for s := ss {    fmt.Println("Got signal", s)    break  }}()wg.Add(1)go func() {  defer wg.Done()  svr := &http.Server{ Addr:":8080", Handler:nil, }  fmt.Println(svr.ListenAndServe())}

很清楚,起了兩個goroutine,然后用WaitGroup等待它們退出。如果它們之間沒有交互,不互相影響,那真的是蠻簡單的,可惜這樣是不行的,因為信號的goroutine收到退出信號后,應該通知server退出。暴力一點的是直接調用svr.Close(),但是如果有些請求還需要取消怎么辦呢?最好用Context了:

wg := sync.WaitGroup{}defer wg.Wait()ctx,cancel := context.WithCancel(context.Background())wg.Add(1)go func() {  defer wg.Done()  ss := make(chan os.Signal, 0)  signal.Notify(ss, syscall.SIGINT, syscall.SIGTERM)  select {  case <- ctx.Done():    return  case s := <- ss:    fmt.Println("Got signal", s)    cancel() // 取消請求,通知用到ctx的所有goroutine    return  }}()wg.Add(1)go func() {  defer wg.Done()  defer cancel()  svr := &http.Server{ Addr:":8080", Handler:nil, }  go func(){    select {    case <- ctx.Done():      svr.Close()    }  }  fmt.Println(svr.ListenAndServe())}

這個方式可以在新開goroutine時繼續使用,譬如新加一個goroutine,里面讀寫了UDPConn:

wg.Add(1)go func() {  defer wg.Done()  defer cancel()  var conn *net.UDPConn  if conn,err = net.Dial("udp", "127.0.0.1:1935"); err != nil {    fmt.Println("Dial UDP server failed, err is", err)    return  }  fmt.Println(UDPRead(ctx, conn))}()UDPRead = func(ctx context.Context, conn *net.UDPConn) (err error) {  wg := sync.WaitGroup{}  defer wg.Wait()  ctx, cancel := context.WithCancel(ctx)  wg.Add(1)  go func() {    defer wg.Done()    defer cancel()    for {      b := make([]byte, core.MTUSize)      size, _, err := conn.ReadFromUDP(b)      // 處理UDP包 b[:size]    }  }()  select {  case <-ctx.Done():    conn.Close()  }  return}

如果只是用到HTTP Server,可以這么寫:

func run(ctx contex.Context) {  server := &http.Server{Addr: addr, Handler: nil}  go func() {    select {    case <-ctx.Done():      server.Close()    }  }()  http.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {  })  fmt.Println(server.ListenAndServe())}

如果需要提供一個API來讓服務器退出,可以這么寫:

func run(ctx contex.Context) {  server := &http.Server{Addr: addr, Handler: nil}  ctx, cancel := context.WithCancel(ctx)  http.HandleFunc("/quit", func(w http.ResponseWriter, r *http.Request) {    cancel() // 使用局部的ctx和cancel  })  go func() {    select {    case <-ctx.Done():      server.Close()    }  }()  fmt.Println(server.ListenAndServe())}

使用局部的ctx和cancel,可以避免cancel傳入的ctx,只是影響當前的ctx。

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久视频精品| 精品国内自产拍在线观看| 日韩av在线免费看| 日韩av观看网址| 日韩中文有码在线视频| 精品久久久久久久久久ntr影视| 国产精品久久久久一区二区| 日韩激情片免费| 国产精品情侣自拍| 久久久精品国产一区二区| 91深夜福利视频| 美女999久久久精品视频| 人人爽久久涩噜噜噜网站| 91精品久久久久久久久久入口| 中文字幕亚洲国产| 国模吧一区二区| 国产欧美一区二区三区四区| 亚洲精品福利在线观看| 久久久免费高清电视剧观看| 97在线视频免费播放| 成人av在线天堂| 国产精品国产三级国产aⅴ9色| 日韩欧美大尺度| 亚洲第一福利在线观看| 国产精品欧美日韩| 欧美成人免费全部观看天天性色| 国产精品亚洲аv天堂网| 亚洲精品成人久久| 国产99久久精品一区二区永久免费| 色悠久久久久综合先锋影音下载| 免费97视频在线精品国自产拍| 亚洲国产小视频在线观看| 日韩中文字幕久久| 成人免费激情视频| 亚洲a中文字幕| 亚洲无av在线中文字幕| 亚洲影视九九影院在线观看| 欧美激情视频网址| 欧洲成人免费视频| 97**国产露脸精品国产| 欧亚精品中文字幕| 少妇久久久久久| 亚洲自拍小视频| 成人xxxxx| 日韩激情av在线免费观看| 中文字幕在线国产精品| 国产精品视频一区二区三区四| 91综合免费在线| 国产欧美一区二区三区久久人妖| 亚洲国产成人在线视频| 国产精品免费久久久久影院| 日韩精品在线免费| 亚洲欧美日韩图片| 欧美噜噜久久久xxx| 成人午夜在线观看| 精品人伦一区二区三区蜜桃免费| 日韩av高清不卡| 亚洲自拍在线观看| 亚洲黄色av女优在线观看| 欧美日韩亚洲91| 97国产一区二区精品久久呦| 国产美女91呻吟求| 日韩高清av一区二区三区| 色99之美女主播在线视频| 欧美综合在线观看| 欧美性猛交xxxx久久久| 久久久人成影片一区二区三区观看| 中文字幕精品在线| 欧美激情视频在线免费观看 欧美视频免费一| 91免费看片在线| 国产91网红主播在线观看| 91久久国产精品| 日韩视频免费大全中文字幕| 国产亚洲欧美日韩一区二区| 亚洲bt欧美bt日本bt| 亚洲欧洲在线观看| 久久免费视频在线| 久久精品小视频| 欧美激情一区二区三区高清视频| 亚洲女人天堂成人av在线| 亚洲成人久久网| 国产亚洲a∨片在线观看| 国产自产女人91一区在线观看| 毛片精品免费在线观看| 色综合久久精品亚洲国产| 亚洲色图25p| 亚洲一区二区精品| 91影院在线免费观看视频| 国内精品中文字幕| 成人中文字幕在线观看| 久久影视三级福利片| 中文字幕亚洲激情| 91在线免费网站| 2019精品视频| 欧美高跟鞋交xxxxhd| 日本电影亚洲天堂| 亚洲色图在线观看| 亚洲福利在线播放| 亚洲国产精品嫩草影院久久| 亚洲欧美精品中文字幕在线| 欧美精品久久久久久久久久| 91精品久久久久久久久久久久久久| 亚洲激情在线观看视频免费| 午夜免费久久久久| 久久99国产精品久久久久久久久| 尤物九九久久国产精品的分类| 最新69国产成人精品视频免费| 国产精品久久久久久av下载红粉| 伊人伊成久久人综合网小说| 精品中文字幕乱| 97视频在线观看免费高清完整版在线观看| 国产ts人妖一区二区三区| 国产精品专区h在线观看| 国产精品观看在线亚洲人成网| 国产精品海角社区在线观看| 日韩欧美aⅴ综合网站发布| 丝袜亚洲另类欧美重口| 狠狠躁夜夜躁久久躁别揉| 色综合久久久久久中文网| 一区二区三区视频观看| 少妇精69xxtheporn| 日韩精品免费综合视频在线播放| 国产精品网红直播| 国产免费亚洲高清| 欧美激情奇米色| 亚洲国产精品va| 成人国产精品久久久久久亚洲| 91精品在线影院| 国产成人精品综合| 亚洲大胆美女视频| 精品色蜜蜜精品视频在线观看| 久久综合九色九九| 国产欧美在线播放| 国产91精品高潮白浆喷水| 在线不卡国产精品| 日韩欧美精品中文字幕| 亚洲精品国产suv| 日韩免费在线播放| 日韩一区二区福利| 久久精品国产91精品亚洲| 久久琪琪电影院| 国产精品丝袜久久久久久不卡| 欧美日韩中文字幕| 久久这里只有精品99| 欧美美女操人视频| 日韩av在线一区| 深夜精品寂寞黄网站在线观看| 欧美日韩视频免费播放| 欧美一级黑人aaaaaaa做受| 国产精品亚发布| 日韩精品高清在线| 95av在线视频| 成人免费黄色网| 成人精品一区二区三区电影免费| 欧美国产日韩一区| 欧美日韩精品国产| 日韩高清欧美高清| 欧美日韩精品中文字幕| 国内免费精品永久在线视频| 国产成人精品在线视频| 国产欧美日韩专区发布| 欧美精品久久久久久久| 亚洲男人天堂网站| 精品国产鲁一鲁一区二区张丽|