Rumah >pembangunan bahagian belakang >Golang >Bagaimana dengan Anggun Menunggu Rutin Pergi Selesai?

Bagaimana dengan Anggun Menunggu Rutin Pergi Selesai?

Barbara Streisand
Barbara Streisandasal
2024-12-07 16:34:15236semak imbas

How to Gracefully Wait for Go Routines to Finish?

Cara Anggun Menunggu Rutin Pergi Selesai

Dalam Go, keselarasan dicapai melalui goroutine, iaitu benang ringan yang berjalan serentak dengan rutin utama. Untuk memastikan program tidak keluar sebelum semua gorout menyelesaikan tugas mereka, adalah penting untuk menunggu dengan betul sehingga mereka selesai.

Menggunakan Saluran untuk Menyiapkan Isyarat

Satu pendekatan biasa untuk menunggu goroutine ialah menggunakan saluran boolean. Apabila goroutine menyelesaikan tugasnya, ia menghantar nilai sebenar kepada saluran dan rutin utama menunggu nilai itu dengan menerima daripada saluran.

func do_stuff(done chan bool) {
    fmt.Println("Doing stuff")
    done <- true
}

func main() {
    fmt.Println("Main")
    done := make(chan bool)
    go do_stuff(done)
    <-done
}

Mengapa <-done berfungsi?

<-selesai ialah operasi penerimaan menyekat. Ini bermakna bahawa rutin utama akan menunggu sehingga nilai dihantar ke saluran selesai. Memandangkan goroutine do_stuff secara eksplisit menghantar nilai sebenar kepada saluran apabila ia selesai, rutin utama akan menerimanya dan meneruskan pelaksanaan.

Apa yang berlaku jika kita menyahkomen baris terakhir?

Jika kami menyahkomen baris terakhir, kami mendapat ralat kebuntuan kerana saluran kosong dan tiada goroutine lain menghantar nilai kepadanya. Oleh itu, rutin utama akan menunggu tanpa terhingga untuk nilai diterima, mengakibatkan kebuntuan.

Pendekatan Alternatif Menggunakan Pakej Penyegerakan

Untuk senario konkurensi yang lebih kompleks, penyegerakan pakej menyediakan mekanisme penyegerakan yang mudah. Contohnya, jika anda perlu menyelaraskan satu siri fungsi jangka panjang, coretan kod berikut menunjukkan cara menggunakan penyegerakan. Jenis WaitGroup:

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            longOp()
            wg.Done()
        }()
    }

    // will wait until wg.Done is called 10 times
    // since we made wg.Add(1) call 10 times
    wg.Wait()
}

func longOp() {
    time.Sleep(time.Second * 2)
    fmt.Println("long op done")
}

Dalam contoh ini, WaitGroup memastikan bahawa rutin utama tidak keluar sehingga semua goroutine memanggil wg.Selesai.

Atas ialah kandungan terperinci Bagaimana dengan Anggun Menunggu Rutin Pergi Selesai?. 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