日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Go 知识点(11) — goroutine 泄露、设置子协程退出条件

發布時間:2023/11/28 生活经验 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go 知识点(11) — goroutine 泄露、设置子协程退出条件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 問題現象

如果在開發過程中不考慮 goroutine 在什么時候能退出和控制 goroutine 生命期,就會造成 goroutine 失控或者泄露的情況 ,看示例代碼:

func consumer(ch chan int) {for {data := <-chfmt.Println(data)}
}func main() {ch := make(chan int)for {var input string// 獲取輸入,模擬進程持續運行fmt.Scan(&input)go consumer(ch)// 輸出現在的goroutine數量fmt.Println("goroutines 個數為:", runtime.NumGoroutine())}}

運行程序,每輸入一個字符串+回車,將會創建一個 goroutine, 結果如下 :

a
goroutines 個數為: 2
b
goroutines 個數為: 3
c
goroutines 個數為: 4
d
goroutines 個數為: 5
e
goroutines 個數為: 6
f
goroutines 個數為: 7
g
goroutines 個數為: 8
h
goroutines 個數為: 9
i
goroutines 個數為: 10

上面代碼模擬一個進程根據需要創建 goroutine 的情況 。我們發現, 隨著輸入的字符串越來越多, goroutine 將會無限制地被創建,但并不會結束,因為 consumer 是個阻塞操作,且 channel 中沒有讓其退出的操作。如果一直持續下去將會造成內存大量分配,最終使進程崩潰。

那要如何解決呢?

2. 解決方案

2.1 創建單個子協程,在子協程中處理業務

修改上面代碼,將創建子協程的代碼挪動到循環外面。

func consumer(ch chan int) {for {data := <-chfmt.Println("data is: ", data)}
}func main() {ch := make(chan int)go consumer(ch) // 在循環外面創建協程for {var input stringfmt.Scan(&input)fmt.Println("goroutines 個數為:", runtime.NumGoroutine())}}

這樣輸出結果為:

a
goroutines 個數為: 2
v
goroutines 個數為: 2
x
goroutines 個數為: 2
w
goroutines 個數為: 2
f
goroutines 個數為: 2
g
goroutines 個數為: 2
b
goroutines 個數為: 2

從結果可以看到協程數量并沒有隨著收入字符的增多而增加,但是存在一個問題就是,子協程并沒有退出的機制。

如何解決呢?接著往下看

2.2 設置子協程退出條件

在主協程中設置當輸入字符串為 quit 時,往通道里面寫入 -1,子協程從通道里面獲取數據為 -1 時就退出。此時主協程仍然是有效的,但是子協程會永遠退出,所以協程數量為 1 。

func consumer(ch chan int) {for {data := <-ch// 收到的數據為 -1 時,退出該循環,同時也會退出該協程if data == -1 {break}fmt.Println("data is: ", data)}}func main() {ch := make(chan int)go consumer(ch) // 在循環外面創建協程for {var input stringfmt.Scan(&input)if input == "quit" {ch <- -1 // 當輸入為 quit 時,往通道里面寫入 -1}// 輸出現在的goroutine數量fmt.Println("goroutines 個數為:", runtime.NumGoroutine())}
}

輸出結果:

a
goroutines 個數為: 2
b
goroutines 個數為: 2
c
goroutines 個數為: 2
d
goroutines 個數為: 2
quit
goroutines 個數為: 2
a
goroutines 個數為: 1
b
goroutines 個數為: 1

3. 總結

從上面示例我們可以總結使用協程的一般原則:

  1. 盡量避免無限制的創建協程;
  2. 在需要反復創建協程的場景下,協程一定要有退出的條件,并且確保該退出條件能滿足(即代碼能執行到);

總結

以上是生活随笔為你收集整理的Go 知识点(11) — goroutine 泄露、设置子协程退出条件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲精品.www | 四虎最新网址在线观看 | 伊人看片 | 中文字幕av无码一区二区三区 | 国产精品高清无码在线观看 | 成人性生交生交视频 | 国产精品免费看久久久无码 | 国产sm网站| 日韩欧美综合视频 | 青青青国产在线 | 精品乱码一区二区三区 | 男生操女生屁股 | 久久这里只有精品99 | 热99在线| 日本久久黄色 | 67194av | caopeng在线视频 | 精品伦精品一区二区三区视频 | 久章草在线观看 | 精品国产aⅴ| 久久精品牌麻豆国产大山 | 中文字幕亚洲第一 | 毛片中文字幕 | 毛片大全在线观看 | 另类小说一区二区 | 午夜网站在线观看 | 亚洲AV无码成人精品一区 | 欧美专区综合 | 欧美三级理论片 | 久久久久亚洲AV成人无在 | 欧美中文字幕第一页 | 不卡在线播放 | 亚洲免费观看高清完整 | 影音先锋在线播放 | 亚洲AV无码久久精品色三人行 | av网址导航 | 四虎成人影视 | 特大黑人巨交吊性xx | 这里精品 | 日日夜夜综合网 | 操欧美老逼 | 自拍偷拍视频网站 | 国产精品免费入口 | 夜夜操夜夜操 | 四虎网站在线 | 怡红院成永久免费人全部视频 | 久久国产精品影视 | 久久精品激情 | 日韩特级片 | 中文字幕丝袜诱惑 | 四虎国产精品成人免费入口 | 亚洲国产精品成人综合 | 黄视频在线观看免费 | 人妻久久久一区二区三区 | 黄色大片免费网站 | 美女毛片在线观看 | 国产日比视频 | 五月丁香啪啪 | 亚洲中文字幕无码一区二区三区 | 无码专区久久综合久中文字幕 | 91麻豆精品国产91久久久久久久久 | 欧日韩视频 | 日干夜干天天干 | 99视频在线播放 | 三级黄视频 | 久久激情综合网 | 欧美综合成人 | 99视频在线| 成年免费在线观看 | 天天干天天上 | 日韩精品四区 | 色综合99久久久无码国产精品 | 在线一区二区三区视频 | 国产在线观看免费视频软件 | 五十路在线视频 | 久久婷婷国产麻豆91 | 日韩精品一区二区免费视频 | 黄色99| 喷水了…太爽了高h | 丝袜美腿亚洲综合 | www.一区二区三区 | 老师上课夹震蛋高潮了 | 图片一区二区 | 欧洲综合视频 | 国产精品一区二区三区在线免费观看 | 丁香花国语版普通话 | 久操精品视频 | 青青操国产视频 | 一区二区91 | 热久久免费视频 | 五月天婷婷在线视频 | 国产精品成人一区二区网站软件 | 欧美 日韩 国产 在线观看 | 少妇人妻一区二区三区 | 在线观看成人动漫 | 白丝女仆被免费网站 | 快色在线观看 | 欧美一区二区在线视频 | 免费欧美视频 |