我正在使用一段有意無限循環的代碼,我無法修改該代碼。我想對該方法編寫一些測試(例如,確保它在正確的時間觸發操作),但我不想孤立一堆 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 或終止其中的循環(除非您可以在其中觸發恐慌,但這是一種糟糕的處理方式那個問題)
- 1 回答
- 0 關注
- 157 瀏覽
添加回答
舉報
0/150
提交
取消