Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Melaksanakan Tunggu Bermasa untuk WaitGroup.Wait() dalam Go?

Bagaimana untuk Melaksanakan Tunggu Bermasa untuk WaitGroup.Wait() dalam Go?

Linda Hamilton
Linda Hamiltonasal
2024-12-03 21:00:19904semak imbas

How to Implement a Timed Wait for WaitGroup.Wait() in Go?

Tunggu Bermasa untuk WaitGroup.Wait()

Dalam Go, jenis WaitGroup digunakan untuk menyegerakkan berbilang goroutin sehingga semua menyelesaikan tugas mereka . Kaedah WaitGroup.Wait() menyekat sehingga semua ahli kumpulan telah memberi isyarat bahawa mereka telah selesai atau konteksnya dibatalkan.

Walau bagaimanapun, kadangkala wajar untuk mengenakan tamat masa pada operasi tunggu WaitGroup, untuk mengelakkan penjadual daripada menunggu pekerja yang sesat selama-lamanya. Ini membuka persoalan falsafah tentang kebolehpercayaan dan kebolehpulihan sistem dengan kehadiran ralat sedemikian, tetapi perbincangan ini di luar skop soalan ini.

Penyelesaian

Penyelesaian yang disediakan menggunakan saluran dan pernyataan pilihan untuk mencapai kefungsian tamat masa:

c := make(chan struct{})
go func() {
    defer wg.Done()
    // Do the work
    c <- struct{}{}
}()
select {
case <-c:
    // Work completed
case <-time.After(timeout):
    // Timed out
}

Penyelesaian ini berkesan, tetapi ia mungkin kelihatan terlalu berbelit-belit. Petua berikut boleh memperbaikinya:

  • Pertimbangkan untuk menggunakan penutupan saluran untuk menandakan selesai dan bukannya menghantar nilai pada saluran. Pembacaan daripada saluran tertutup sentiasa diteruskan dengan serta-merta.
  • Gunakan penyata tangguh untuk menandakan selesai. Ia dilaksanakan walaupun fungsi ditamatkan secara tiba-tiba.
  • Jika hanya ada satu kerja yang perlu menunggu, tinggalkan WaitGroup dan gunakan saluran secara terus.
  • Untuk tamat masa, nyatakan tempoh secara langsung, mis., tamat masa := masa.Kedua (atau 2 * masa.Kedua selama 2 saat tamat masa).

Fungsi Pembantu

Untuk memudahkan proses, fungsi pembantu boleh dibuat untuk merangkum logik tamat masa:

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 // Completed normally
    case <-time.After(timeout):
        return true // Timed out
    }
}

Fungsi ini membungkus fungsi tamat masa dan memudahkannya gunakan:

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

Pendekatan ini menyediakan cara yang lebih bersih dan mudah untuk mengendalikan tamat masa untuk operasi WaitGroup.Wait().

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Tunggu Bermasa untuk 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