Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menambah Masa Tamat pada WaitGroup.Wait() dalam Go?

Bagaimana untuk Menambah Masa Tamat pada WaitGroup.Wait() dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-11-21 06:03:09743semak imbas

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

Bosan Menunggu Selamanya? Menambahkan Tamat Masa pada WaitGroup.Wait()

Apabila anda menggunakan WaitGroup.Wait() untuk menyegerakkan gorouti dan memastikan ia selesai dilaksanakan, anda mungkin sekali-sekala menginginkan keupayaan untuk menamatkan menunggu selepas tempoh tertentu. Ini menghalang sistem anda daripada bergantung tanpa henti pada pekerja ingkar yang mungkin tidak pernah menyelesaikan tugas mereka.

Penyelesaian Pragmatik untuk Kumpulan Menunggu Bermasa

Satu pendekatan untuk melaksanakan tamat masa melibatkan penggunaan gabungan goroutine, saluran, dan pakej masa. Ideanya adalah untuk mencipta saluran yang menerima isyarat setelah selesai semua goroutine. Pada masa yang sama, pemasa dimulakan dengan tempoh tamat masa yang diingini. Pernyataan pilih digunakan untuk memantau kedua-dua saluran dan pemasa:

import (
    "sync"
    "time"
)

func task(wg *sync.WaitGroup) {
    // Perform some task...
    time.Sleep(time.Second * 2)
    wg.Done()
}

func main() {
    var wg sync.WaitGroup
    wg.Add(2)
    go task(&wg)
    go task(&wg)

    ch := make(chan struct{})
    defer close(ch)

    go func() {
        defer wg.Done()
        wg.Wait()
        close(ch)
    }()

    timeout := 5*time.Second

    select {
    case <-ch:
        fmt.Println("All jobs completed within timeout.")
    case <-time.After(timeout):
        fmt.Println("Timeout reached, not all jobs completed.")
    }
}

Memudahkan Masa Tamat dengan Fungsi Pembantu

Untuk menawarkan pendekatan yang lebih mudah dan boleh digunakan semula, pertimbangkan untuk mencipta fungsi pembantu yang merangkumi fungsi ini:

func waitTimeout(wg *sync.WaitGroup, timeout time.Duration) bool {
    c := make(chan struct{})
    go func() {
        defer close(c)
        wg.Wait()
    }()
    select {
    case <-c:
        return false
    case <-time.After(timeout):
        return true
    }
}

Fungsi pembantu ini menerima WaitGroup dan tempoh tamat masa yang diingini serta mengembalikan sama ada menunggu melebihi had yang ditentukan atau tidak.

Penggunaan Fungsi Pembantu

Menggunakan fungsi pembantu adalah mudah:

if waitTimeout(&wg, 5*time.Second) {
    fmt.Println("Timeout reached waiting for wait group.")
}

Dalam contoh ini, fungsi waitTimeout kembali benar jika kumpulan menunggu mengambil masa lebih lama daripada 5 saat untuk selesai, menunjukkan bahawa tamat masa telah berlaku.

Atas ialah kandungan terperinci Bagaimana untuk Menambah Masa Tamat pada WaitGroup.Wait() dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn