2 回答

TA貢獻1827條經驗 獲得超8個贊
使用上下文。
使用可能被取消的上下文運行。使用關聯的取消函數運行。f1f2
func f1(ctx context.Context) {
go func(ctx context.Context) {
t := time.NewTimer(time.Minute)
select {
case <-t.C:
// Do stuff
case <-ctx.Done():
return
}
}(ctx)
}
func f2(cancel context.CancelFunc) {
cancel()
}
稍后,為了協調這兩個函數,您將執行以下操作:
ctx, cancel := context.WithCancel(context.Background())
f1(ctx)
f2(cancel)
您還可以試驗該函數以合并外部定義的超時。context.WithTimeout
如果您不知道是否已經有一個goroutine在運行,您可以像上面那樣初始化和變量,但不要將它們傳遞給任何東西。這樣就避免了必須檢查 .ctxcancelnil
請記住將 ctx 和 cancel 視為要復制的變量,而不是引用,因為您不希望多個 goroutine 共享內存 - 這可能會導致爭用條件。

TA貢獻1909條經驗 獲得超7個贊
您可以為通道指定緩沖區大小為 1。這意味著您可以在不阻塞的情況下向其發送一個值,即使該值沒有立即(或根本沒有收到)也是如此。
var quit = make(chan bool, 1)
我認為最好的答案是更好的,這只是另一種可以轉化為其他情況的解決方案。
- 2 回答
- 0 關注
- 100 瀏覽
添加回答
舉報