Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Memastikan Rutin Pergi Selesai Sebelum Keluar Utama?

Bagaimana untuk Memastikan Rutin Pergi Selesai Sebelum Keluar Utama?

DDD
Lepaskan: 2024-12-09 16:33:14
asal
802 orang telah melayarinya

How to Ensure Go Routines Complete Before Main Exits?

Menunggu Selesai Rutin Pergi

Dalam Go, amalan biasa ialah menggunakan gorout untuk melaksanakan tugasan serentak. Untuk memastikan program utama menunggu semua goroutine selesai sebelum keluar, adalah penting untuk melaksanakan mekanisme penyegerakan yang betul.

Satu pendekatan, seperti yang dinyatakan dalam soalan, melibatkan penggunaan saluran boolean (selesai):

func do_stuff(done chan bool) {
    fmt.Println("Doing stuff")
    done <- true
}
Salin selepas log masuk
func main() {
    fmt.Println("Main")
    done := make(chan bool)
    go do_stuff(done)
    <-done
}
Salin selepas log masuk

Mengapa <-selesai Berfungsi:

Operasi <-selesai ialah penerimaan saluran menyekat. Ia menunggu sehingga nilai dihantar pada saluran selesai. Dalam kod yang disediakan, do_stuff menghantar benar pada saluran selepas tugasan selesai, menyebabkan operasi <-selesai dalam utama berjaya.

Kebuntuan daripada Menyahkomen Baris Terakhir:

Menyahkomen baris terakhir dalam utama membawa kepada kebuntuan:

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

Detik ini Operasi <-dilakukan cuba membaca dari saluran kosong tanpa sebarang nilai penghantaran goroutine kepadanya. Akibatnya, atur cara itu terhenti dalam kebuntuan.

Kaedah Penyegerakan Alternatif Menggunakan Pakej penyegerakan:

Untuk senario yang lebih kompleks, pakej penyegerakan menawarkan primitif penyegerakan alternatif. Dalam kod yang disediakan, sync.WaitGroup boleh menjejaki penyiapan goroutine dengan berkesan:

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 (10 goroutines finish)
    wg.Wait()
}

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

Penggunaan penyegerakan.WaitGroup memastikan yang utama menunggu sehingga kesemua 10 goroutine selesai sebelum keluar dari program.

Atas ialah kandungan terperinci Bagaimana untuk Memastikan Rutin Pergi Selesai Sebelum Keluar Utama?. 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