首頁 > 後端開發 > Golang > 如何在 Go 中設定 WaitGroup.Wait() 逾時?

如何在 Go 中設定 WaitGroup.Wait() 逾時?

DDD
發布: 2024-11-12 20:47:02
原創
718 人瀏覽過

How to Set a Timeout for WaitGroup.Wait() in Go?

WaitGroup.Wait() 超時

WaitGroup.Wait() 可以無限期阻塞,等待所有 goroutine 完成。當您想要保護系統免受可能無限期阻止執行的錯誤工作人員影響時,這可能會出現問題。雖然沒有慣用的方法來為 WaitGroup.Wait() 設定超時,但有多種方法可以實現此功能。

一種常見的方法涉及使用通道和 goroutine。當 goroutine 完成工作時,它會向通道發送訊號。主程式可以選擇通道和定時器來確定 goroutine 是否逾時。以下是範例:

import (
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    wg.Add(1)

    timeout := time.After(5 * time.Second)
    ch := make(chan struct{})

    go func() {
        defer wg.Done()
        defer close(ch)
        // Do some work
    }()

    select {
    case <-ch:
        // Goroutine finished before timeout
        wg.Wait() // Wait for all goroutines to finish
    case <-timeout:
        // Goroutine timed out
        wg.Wait() // Block until all goroutines have completed
        log.Println("Timeout occurred")
    }
}
登入後複製

此解法使用 select 語句在頻道或計時器上等待,為 WaitGroup.Wait() 提供逾時機制。其他建議的最佳化包括使用 defer 語句來關閉通道以及使用無類型常數來設定逾時持續時間。

或者,您可以使用包裝上述功能的自訂輔助函數,從而簡化程式碼並使其更可重複使用。以下是一個範例:

func waitTimeout(wg *sync.WaitGroup, timeout time.Duration) bool {
    c := make(chan struct{})
    defer close(c)

    go func() {
        wg.Wait()
        c <- struct{}{}
    }()

    select {
    case <-c:
        return false // Completed normally
    case <-time.After(timeout):
        return true // Timed out
    }
}
登入後複製

此函數可以如下使用:

if waitTimeout(&wg, 5*time.Second) {
    fmt.Println("Timed out waiting for wait group")
} else {
    fmt.Println("Wait group finished")
}
登入後複製

這些方法提供了一種為WaitGroup.Wait() 設定超時的方法,讓您保護您的系統不會被錯誤的工作人員無限期地阻止執行。

以上是如何在 Go 中設定 WaitGroup.Wait() 逾時?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板