2 回答

TA貢獻1827條經(jīng)驗 獲得超8個贊
使用上下文。
使用可能被取消的上下文運行。使用關(guān)聯(lián)的取消函數(shù)運行。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()
}
稍后,為了協(xié)調(diào)這兩個函數(shù),您將執(zhí)行以下操作:
ctx, cancel := context.WithCancel(context.Background())
f1(ctx)
f2(cancel)
您還可以試驗該函數(shù)以合并外部定義的超時。context.WithTimeout
如果您不知道是否已經(jīng)有一個goroutine在運行,您可以像上面那樣初始化和變量,但不要將它們傳遞給任何東西。這樣就避免了必須檢查 .ctxcancelnil
請記住將 ctx 和 cancel 視為要復(fù)制的變量,而不是引用,因為您不希望多個 goroutine 共享內(nèi)存 - 這可能會導(dǎo)致爭用條件。

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