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

Bagaimana dengan Anggun Menunggu Rutin Pergi Selesai?

Barbara Streisand
Lepaskan: 2024-12-07 16:34:15
asal
235 orang telah melayarinya

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

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

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!

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