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

首頁 > 編程 > Golang > 正文

Golang優雅關閉channel的方法示例

2020-04-01 19:01:45
字體:
來源:轉載
供稿:網友

前言

最近使用go開發后端服務,服務關閉需要保證golang/71577.html">channel中的數據都被讀取完,理由很簡單,在收到系統的中斷信號后,系統需要做收尾工作,保證channel的數據都要被處理掉,然后才可以關閉系統。但實現起來沒那么簡單,下面來一起看看詳細的介紹吧。

關于Go channel設計和規范的批評:

  • 在不能更改channel狀態的情況下,沒有簡單普遍的方式來檢查channel是否已經關閉了
  • 關閉已經關閉的channel會導致panic,所以在closer(關閉者)不知道channel是否已經關閉的情況下去關閉channel是很危險的
  • 發送值到已經關閉的channel會導致panic,所以如果sender(發送者)在不知道channel是否已經關閉的情況下去向channel發送值是很危險的

所以Golang 內建的 close 方法可以關閉 channel,如果往已經關閉的 channel 發送數據,則會報錯:panic: close of closed channel.

看如下代碼,在一段時間內,生產者可以不斷往 channel 寫入數據,消費者進行處理,一段時間后 channel 關閉了,這個時候如果還有數據往 channel 發送,程序就會報錯。

package main import ( "fmt" "sync" "time") func main() { jobs := make(chan int) var wg sync.WaitGroup go func() { time.Sleep(time.Second * 3) close(jobs) }() go func() { for i := 0; ; i++ { jobs <- i fmt.Println("produce:", i) } }() wg.Add(1) go func() { defer wg.Done() for i := range jobs { fmt.Println("consume:", i) } }() wg.Wait()}

多運行幾次出錯的概率會比較大:

produce: 33334consume: 33334consume: 33335produce: 33335produce: 33336consume: 33336consume: 33337produce: 33337produce: 33338consume: 33338consume: 33339produce: 33339produce: 33340consume: 33340panic: send on closed channel goroutine 19 [running]:panic(0x49b660, 0xc042410bb0)  C:/Go/src/runtime/panic.go:500 +0x1afmain.main.func2(0xc04203a180)  C:/Users/tanteng/Go/src/examples/channel_close.go:18 +0x6bcreated by main.main  C:/Users/tanteng/Go/src/examples/channel_close.go:21 +0xb8exit status 2

如何優雅關閉 channel

那么在往通道發數據前如何判斷通道是否關閉呢?

1._,ok := <- jobs

此時如果 channel 關閉,ok 值為 false,如果 channel 沒有關閉,則會漏掉一個 jobs

2.使用 select 方式

再創建一個 channel,叫做 timeout,如果超時往這個 channel 發送 true,在生產者發送數據給 jobs 的 channel,用 select 監聽 timeout,如果超時則關閉 jobs 的 channel.

完整代碼如下:

package main import ( "fmt" "sync" "time") func main() { jobs := make(chan int) timeout := make(chan bool) var wg sync.WaitGroup go func() { time.Sleep(time.Second * 3) timeout <- true }() go func() { for i := 0; ; i++ { select { case <-timeout: close(jobs) return  default: jobs <- i fmt.Println("produce:", i) } } }() wg.Add(1) go func() { defer wg.Done() for i := range jobs { fmt.Println("consume:", i) } }() wg.Wait()}

這樣就可以保證不會往已經關閉的 channel 中發送數據了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色中色综合影院手机版在线观看| 日韩免费av在线| 久久全国免费视频| 97人人爽人人喊人人模波多| 超薄丝袜一区二区| 国产精品福利小视频| 久久视频中文字幕| 51色欧美片视频在线观看| 欧美wwwwww| 日韩av毛片网| 欧美日韩国内自拍| 精品亚洲国产成av人片传媒| 久久资源免费视频| 久久精品色欧美aⅴ一区二区| 91夜夜揉人人捏人人添红杏| 98精品国产高清在线xxxx天堂| 自拍偷拍亚洲欧美| 国产精品久久久久久久久久久久| 高跟丝袜欧美一区| 一区二区三区视频免费在线观看| 久久伊人91精品综合网站| 日韩精品一区二区视频| 亚洲成人在线视频播放| 亚洲精品综合精品自拍| 亚洲福利视频专区| 色综合视频一区中文字幕| 午夜精品久久久久久久男人的天堂| 亚洲国产精品美女| 国产精品久久久久久一区二区| 亚洲精品在线观看www| 一本色道久久88综合日韩精品| 日韩视频免费在线观看| 81精品国产乱码久久久久久| 日本久久久久久| 日韩欧美亚洲综合| 这里只有精品久久| 欧美性高潮在线| 日本aⅴ大伊香蕉精品视频| 亚洲精品久久久久久久久久久| 国产国产精品人在线视| 国产欧美精品一区二区三区-老狼| 国产手机视频精品| 欧美一区二区三区四区在线| 久久久久久国产免费| 日韩亚洲欧美中文高清在线| 国产成人精品亚洲精品| 日本一区二区三区四区视频| 伊人久久大香线蕉av一区二区| 中文字幕久久精品| 97视频在线播放| 久久久久久午夜| 欧美日韩激情视频| 亚洲va欧美va国产综合久久| 91wwwcom在线观看| 97**国产露脸精品国产| 91沈先生在线观看| 国产精品综合不卡av| 97国产精品视频| 国产www精品| 久久久久久午夜| 精品女同一区二区三区在线播放| 隔壁老王国产在线精品| 97在线精品视频| 91在线|亚洲| 成人福利在线观看| 亚洲最新av网址| 欧美精品精品精品精品免费| 欧美激情亚洲激情| 日韩电视剧在线观看免费网站| 国产午夜精品视频| 久久久精品在线| 日韩va亚洲va欧洲va国产| 成人午夜高潮视频| 亚洲乱码国产乱码精品精| 亚洲精品成人久久电影| 亚洲国产成人精品一区二区| 日本精品久久久久影院| 亚洲在线www| 欧美日韩国产丝袜另类| 91精品国产自产在线老师啪| 欧美福利视频在线观看| 成人精品一区二区三区电影免费| 欧美xxxx18性欧美| 国产精品久久久久久久久借妻| 亚洲天堂免费在线| 98精品国产高清在线xxxx天堂| 中文字幕亚洲综合久久筱田步美| 亚洲毛片在线看| 日韩美女在线看| 国产成人激情视频| 亚洲男人av电影| 国产日韩在线看| 久久国产精品亚洲| 国产精品九九九| 久久久天堂国产精品女人| 亚洲欧美中文另类| 国产精品免费在线免费| 国产成人久久精品| 在线日韩中文字幕| 欧美乱大交xxxxx| 欧美成人手机在线| 国产精品日韩在线| 久久久久久91香蕉国产| 亚洲电影成人av99爱色| 国产中文欧美精品| 欧美激情欧美激情| 亚洲欧美另类人妖| 狠狠久久五月精品中文字幕| 亚洲tv在线观看| 成人性生交大片免费观看嘿嘿视频| 欧美激情精品久久久久久蜜臀| 亚洲精品日产aⅴ| 亚洲日本成人网| 在线观看日韩www视频免费| 国产精品美女www爽爽爽视频| 国产精品99久久久久久人| 日韩精品电影网| 97在线观看免费| 亚洲精品网站在线播放gif| 红桃av永久久久| 精品视频9999| 尤物精品国产第一福利三区| 国产午夜精品一区二区三区| 91色视频在线导航| 91色p视频在线| 黑人与娇小精品av专区| 色综合91久久精品中文字幕| 69久久夜色精品国产69| 欧美国产视频一区二区| 91网站在线看| 欧美成人亚洲成人| 成人在线视频网站| 久久精品欧美视频| 国产欧美va欧美va香蕉在线| 日本国产一区二区三区| 欧美日韩国产一中文字不卡| 久久精品国产亚洲7777| 精品国内亚洲在观看18黄| 国产精品久久久久aaaa九色| 91日韩在线视频| 国产成人久久久| 久热爱精品视频线路一| 国外日韩电影在线观看| 国产啪精品视频| 亚洲精品99久久久久中文字幕| 国产精品自拍小视频| 国产成人一区二| 丝袜一区二区三区| 欧洲精品在线视频| 国产中文字幕亚洲| 91在线观看免费网站| 日韩av在线网页| 欧美激情乱人伦| 亚洲香蕉av在线一区二区三区| 97碰碰碰免费色视频| 日韩欧美第一页| 精品国产一区二区三区在线观看| 久久久免费电影| 国产精品久久久亚洲| 久久成年人视频| 欧美老女人性生活| 久久久久久久影院| 国产精品免费一区二区三区都可以| 久久免费福利视频|