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

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

DDD
Lepaskan: 2024-11-12 20:47:02
asal
728 orang telah melayarinya

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

Tamat masa untuk WaitGroup.Wait()

WaitGroup.Wait() boleh menyekat selama-lamanya, menunggu semua goroutine selesai. Ini boleh menjadi masalah apabila anda ingin melindungi sistem anda daripada pekerja sesat yang berpotensi menghalang pelaksanaan selama-lamanya. Walaupun tiada cara idiomatik untuk menetapkan tamat masa untuk WaitGroup.Wait(), terdapat beberapa pendekatan untuk mencapai fungsi ini.

Satu pendekatan biasa melibatkan penggunaan saluran dan goroutine. Apabila goroutine menyelesaikan kerjanya, ia menghantar isyarat ke saluran. Program utama boleh memilih pada saluran dan pemasa untuk menentukan sama ada goroutine tamat masa. Berikut ialah contoh:

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

Penyelesaian ini menggunakan pernyataan pilihan untuk menunggu sama ada pada saluran atau pemasa, menyediakan mekanisme tamat masa untuk WaitGroup.Wait(). Pengoptimuman lain yang disyorkan termasuk menggunakan penyataan tangguh untuk menutup saluran dan menggunakan pemalar yang tidak ditaip untuk tempoh tamat masa.

Sebagai alternatif, anda boleh menggunakan fungsi pembantu tersuai yang membungkus fungsi di atas, memudahkan kod dan menjadikannya lebih boleh digunakan semula. Berikut ialah contoh:

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

Fungsi ini boleh digunakan seperti berikut:

if waitTimeout(&wg, 5*time.Second) {
    fmt.Println("Timed out waiting for wait group")
} else {
    fmt.Println("Wait group finished")
}
Salin selepas log masuk

Pendekatan ini menyediakan cara untuk menetapkan tamat masa untuk WaitGroup.Wait(), membolehkan anda melindungi sistem anda daripada pekerja sesat menyekat pelaksanaan selama-lamanya.

Atas ialah kandungan terperinci Bagaimana untuk Menetapkan Tamat Masa untuk 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan