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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

回答我,停止 Goroutine 有几种方法?

發布時間:2024/4/11 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 回答我,停止 Goroutine 有几种方法? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

大家好,我是煎魚。

協程(goroutine)作為 Go 語言的扛把子,經常在各種 Go 工程項目中頻繁露面,甚至有人會為了用 goroutine 而強行用他。

在 Go 工程師的面試中,也繞不開他,會有人問 ”如何停止一個 goroutine?”,一下子就把話題范圍擴大了,這是一個涉及多個知識點的話題,能進一步深入問。

為此,今天煎魚就帶大家了解一下停止 goroutine 的方法!

goroutine 案例

在日常的工作中,我們常會有這樣的 Go 代碼,go 關鍵字一把搜起一個 goroutine:

func?main()?{?ch?:=?make(chan?string,?6)go?func()?{for?{ch?<-?"腦子進煎魚了"}}() }

初入 goroutine 大門的開發者可能就完事了,但跑一段時間后,他就可能會遇到一些問題,苦苦排查...

像是:當 goroutine 內的任務,運行的太久,又或是卡死了...就會一直阻塞在系統中,變成 goroutine 泄露,或是間接造成資源暴漲,會帶來許多的問題。

如何在停止 goroutine,就成了一門必修技能了,不懂就沒法用好 goroutine。

關閉 channel

第一種方法,就是借助 channel 的 close 機制來完成對 goroutine 的精確控制。

代碼如下:

func?main()?{ch?:=?make(chan?string,?6)go?func()?{for?{v,?ok?:=?<-chif?!ok?{fmt.Println("結束")return}fmt.Println(v)}}()ch?<-?"煎魚還沒進鍋里..."ch?<-?"煎魚進腦子里了!"close(ch)time.Sleep(time.Second) }

在 Go 語言的 channel 中,channel 接受數據有兩種方法:

msg?:=?<-ch msg,?ok?:=?<-ch

這兩種方式對應著不同的 runtime 方法,我們可以利用其第二個參數進行判別,當關閉 channel 時,就根據其返回結果跳出。

另外我們也可以利用 for range 的特性:

go?func()?{for?{for?v?:=?range?ch?{fmt.Println(v)}}}()

其會一直循環遍歷通道 ch,直到其關閉為止,是頗為常見的一種用法。

定期輪詢 channel

第二種方法,是更為精細的方法,其結合了第一種方法和類似信號量的處理方式。

代碼如下:

func?main()?{ch?:=?make(chan?string,?6)done?:=?make(chan?struct{})go?func()?{for?{select?{case?ch?<-?"腦子進煎魚了":case?<-done:close(ch)return}time.Sleep(100?*?time.Millisecond)}}()go?func()?{time.Sleep(3?*?time.Second)done?<-?struct{}{}}()for?i?:=?range?ch?{fmt.Println("接收到的值:?",?i)}fmt.Println("結束") }

在上述代碼中,我們聲明了變量 done,其類型為 channel,用于作為信號量處理 goroutine 的關閉。

而 goroutine 的關閉是不知道什么時候發生的,因此在 Go 語言中會利用 for-loop 結合 select 關鍵字進行監聽,再進行完畢相關的業務處理后,再調用 close 方法正式關閉 channel。

若程序邏輯比較簡單結構化,也可以不調用 close 方法,因為 goroutine 會自然結束,也就不需要手動關閉了。

使用 context

第三種方法,可以借助 Go 語言的上下文(context)來做 goroutine 的控制和關閉。

代碼如下:

func?main()?{ch?:=?make(chan?struct{})ctx,?cancel?:=?context.WithCancel(context.Background())go?func(ctx?context.Context)?{for?{select?{case?<-ctx.Done():ch?<-?struct{}{}returndefault:fmt.Println("煎魚還沒到鍋里...")}time.Sleep(500?*?time.Millisecond)}}(ctx)go?func()?{time.Sleep(3?*?time.Second)cancel()}()<-chfmt.Println("結束") }

在 context 中,我們可以借助 ctx.Done 獲取一個只讀的 channel,類型為結構體。可用于識別當前 channel 是否已經被關閉,其原因可能是到期,也可能是被取消了。

因此 context 對于跨 goroutine 控制有自己的靈活之處,可以調用 context.WithTimeout 來根據時間控制,也可以自己主動地調用 cancel 方法來手動關閉。

干掉另外一個 goroutine

在了解了停止 goroutine 的 3 種經典方法后,又有小伙伴提出了新的想法。就是 “我想在 goroutineA 里去停止 goroutineB,有辦法嗎?

答案是不能,因為在 Go 語言中,goroutine 只能自己主動退出,一般通過 channel 來控制,不能被外界的其他 goroutine 關閉或干掉,也沒有 goroutine 句柄的顯式概念。

go/issues/32610

在 Go issues 中也有人提過類似問題,Dave Cheney 給出了一些思考:

  • 如果一個 goroutine 被強行停止了,它所擁有的資源會發生什么?堆棧被解開了嗎?defer 是否被執行?

    • 如果執行 defer,該 goroutine 可能可以繼續無限期地生存下去。

    • 如果不執行 defer,該 goroutine 原本的應用程序系統設計邏輯將會被破壞,這肯定不合理。

  • 如果允許強制停止 goroutine,是要釋放所有東西,還是直接把它從調度器中踢出去,你想通過此解決什么問題?

這都是值得深思的,另外一旦放開這種限制。作為程序員,你維護代碼。很有可能就不知道 goroutine 的句柄被傳到了哪里,又是在何時何地被人莫名其妙關閉,非常糟糕...

總結

在今天這篇文章中,我們介紹了在 Go 語言中停止 goroutine 的三大經典方法(channel、context,channel+context)和其背后的使用原理。

同時針對 goroutine 不可以跨 goroutine 強制停止的原因進行了分析。其實 goroutine 的設計就是這樣的,包括像 goroutine+panic+recover 的設計也是遵循這個原理,因此也有的 Go 開發者總是會誤以為跨 goroutine 能有 recover 接住...

記住,在 Go 語言中每一個 goroutine 都需要自己承擔自己的任何責任,這是基本原則。

(你已經是個成熟的 goroutine 了...)

關注煎魚,吸取他的知識?👆

你好,我是煎魚。高一折騰過前端,參加過國賽拿了獎,大學搞過 PHP。現在整 Go,在公司負責微服務架構等相關工作推進和研發。

從大學開始靠自己賺生活費和學費,到出版 Go 暢銷書《Go 語言編程之旅》,再到獲得 GOP(Go 領域最有觀點專家)榮譽,點擊藍字查看我的出書之路

日常分享高質量文章,輸出 Go 面試、工作經驗、架構設計,加微信拉讀者交流群,記得點贊!

總結

以上是生活随笔為你收集整理的回答我,停止 Goroutine 有几种方法?的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: av网站免费大全 | 麻豆美女视频 | 亚洲精品视频免费 | 日本成人一区二区 | 亚洲免费观看 | 日本成人在线一区 | 91久久超碰| 99热这里精品 | 四色成人av永久网址 | 妞妞影视 | 亚洲激情欧美色图 | 中文字幕一区二区三区人妻电影 | 99精品免费观看 | av成人 | 黄色网址www| 国产精品永久久久久久久久久 | 第一宅男av导航入口 | 在线观看不卡一区 | 久久在线免费观看 | 999综合网 | 国产在线视频99 | 97超碰成人 | 久久片| 亚洲一区久久久 | 日本成人社区 | 欧美一级免费视频 | 成人在线小视频 | 亚洲免费观看高清完整版在线 | 午夜黄色大片 | 国产吃瓜黑料一区二区 | 高清精品xnxxcom | 国内一区二区三区 | 影视av| 99久久久无码国产 | 久久性生活片 | 国产美女性生活 | 亚洲码无人客一区二区三区 | 亚洲永久在线观看 | 久久免费少妇高潮99精品 | 久久中文字幕一区二区 | 欧美精品导航 | 9色av | 日本欧美日韩 | 免费人成 | 黄色一级免费网站 | 日韩一级二级三级 | www成人免费| 99国产精品一区二区 | 国产av一区二区不卡 | 日韩免费视频观看 | 日本打屁股网站 | 国产69精品久久久久999小说 | 亚洲精品乱码久久久久久蜜桃图片 | 91成人在线免费视频 | 91精品国产日韩91久久久久久 | 日本三级中文字幕 | av国产网站| 精品国产乱码久久久久久蜜臀网站 | 西欧free性满足hd老熟妇 | 女性喷水视频 | 日韩毛片网 | 黄色片a级片 | 乱妇乱女熟妇熟女网站 | 国产欧美日韩精品在线观看 | 爆乳熟妇一区二区三区 | 99国产精品一区二区 | 亚洲国产aaa | 日本天堂网在线 | 日韩在线一区二区 | 国产一区不卡在线观看 | 国产精品久久久久毛片 | 久久久久一区二区三区 | 午夜肉伦伦 | 国产精品传媒一区二区 | 国产视频在线观看视频 | 先锋影音一区二区 | 国产日韩一区二区三区 | 日本女优黄色 | 欧美少妇精品 | 精品不卡在线 | 免费三片60分钟 | 自拍欧美日韩 | 最新中文字幕免费视频 | 香蕉视频网站在线观看 | www色婷婷 | 日本特级黄色大片 | 各种含道具高h调教1v1男男 | 毛片麻豆 | 天天干网址 | 国产精品无遮挡 | 在线观看av黄色 | 91九色偷拍 | 色牛av| 亚洲国产日韩欧美在线观看 | 日韩视频免费在线观看 | 欧美日本在线视频 | 麻豆视频免费观看 | 999久久久免费精品国产 | 色婷婷综合激情 |