亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在無限循環中殺死一個方法(golang)

在無限循環中殺死一個方法(golang)

Go
慕娘9325324 2022-01-17 20:17:00
我正在使用一段有意無限循環的代碼,我無法修改該代碼。我想對該方法編寫一些測試(例如,確保它在正確的時間觸發操作),但我不想孤立一堆 go 例程。因此,我正在嘗試找到一種可以殺死/中斷該 goroutine 的方法。我正在考慮嘗試將其包裝在一個包裝函數中,該函數會在發出信號后將其殺死。像這樣(不起作用)。func wrap(inf func()) func() {  return func() {    select {    case inf():    case <-time.After(5 * time.Second):    }  }}func main() {  go wrap(inf())()  // do things}我能想到的所有變化都不起作用。我正在考慮將它包裝inf在一個寫入通道(永遠不會被調用)的函數中,或者帶有 return 語句的東西。然后select可以從中讀取。問題是你必須啟動它。如果您在此例程中執行此操作,您將永遠無法到達select. 如果你在另一個例程中這樣做,你只會讓問題變得更糟。那么,有沒有一種方法可以讓我終止這種例行程序?(是的 - 我寧愿更改無限循環代碼,但不能在這里)
查看完整描述

1 回答

?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

如果你不能改變循環代碼,你就不能殺死循環。Go 是有意設計的,因此除了實際終止程序本身之外,沒有辦法從 goroutine 之外殺死 goroutine。


如果您可以更改循環本身,那么殺死例程的典型方法是為 goroutine 提供退出通道,然后關閉(或發送)該通道以告知循環退出。例子:


quitCh := make(chan struct{})

go func() {

    for {

        select {

        case <-quitCh:

            return

        // other cases to handle what you need to do

        }

    }

}()


// Once you're done

close(quitCh) // goroutine exits

但是如果沒有某種方法將閉包行為編碼到循環本身中,就無法(據我所知)專門殺死該 goroutine 或終止其中的循環(除非您可以在其中觸發恐慌,但這是一種糟糕的處理方式那個問題)


查看完整回答
反對 回復 2022-01-17
  • 1 回答
  • 0 關注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號