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
Lepaskan: 2024-11-21 06:03:09
asal
779 orang telah melayarinya

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.")
    }
}
Salin selepas log masuk

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
    }
}
Salin selepas log masuk

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.")
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan