在Go 中,可以為WaitGroup.Wait() 設定時間限制,以防止無限錯誤的工作執行緒。以下是對實現它的慣用方法和替代方法的詳細探索。
以下方法被廣泛認為是最慣用的解決方案:
import ( "sync" "time" ) func waitTimeout(wg *sync.WaitGroup, timeout time.Duration) bool { c := make(chan struct{}) go func() { wg.Wait() close(c) }() select { case <-c: return false // completed normally case <-time.After(timeout): return true // timed out } }
為了更簡單的實現,請考慮以下內容:
另一種方法涉及使用可取消的上下文context:
import ( "context" "sync/atomic" "sync" ) func waitWithCancel(ctx context.Context, wg *sync.WaitGroup) bool { ctxDone := make(chan struct{}) var exited int32 go func() { defer close(ctxDone) wg.Wait() atomic.StoreInt32(&exited, 1) }() select { case <-ctx.Done(): return atomic.LoadInt32(&exited) == 0 case <-ctxDone: return true } }
以上是如何在 Go 中實作 WaitGroup.Wait() 逾時?的詳細內容。更多資訊請關注PHP中文網其他相關文章!