Go 中case 選擇的優先權
Go 的select 語句中,case 求值的順序是不確定的,導致處理上下文時可能存在不一致的情況及時取消活動。一個常見的場景涉及發送定期心跳的後台例程,當上下文被取消時,該例程應立即停止。然而,由於不可預測的選擇順序,即使在上下文取消後也可以觀察到心跳的發送。
為了確保在上下文取消時立即終止心跳,需要更強大的方法。首選方法是明確優先考慮上下文取消情況,而不是依賴情況評估的順序。這可以透過使用具有所需優先權的巢狀 select 語句來實現:上下文取消情況應放置在外部 select 語句中,然後是處理心跳功能的第二個 select 語句。
考慮以下修改後的程式碼:
func sendRegularHeartbeats(ctx context.Context) { ticker := time.NewTicker(time.Second) defer ticker.Stop() for { //outer select, giving priority to context cancellation select { case <-ctx.Done(): return default: } //inner select for heartbeat functionality select { case <-ctx.Done(): return case <-ticker.C: sendHeartbeat() } } }
透過將心跳處理情況嵌套在外部select 語句中,我們有效地優先考慮上下文取消情況,確保在上下文被取消時立即執行。這消除了上下文取消後發送任何心跳的可能性,並保證了所需的行為。
以上是如何保證Go的select語句及時取消上下文?的詳細內容。更多資訊請關注PHP中文網其他相關文章!