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

Bagaimana untuk Memastikan Rutin Pergi Selesai Sebelum Keluar Utama?

DDD
DDDasal
2024-12-09 16:33:14779semak imbas

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
}
func main() {
    fmt.Println("Main")
    done := make(chan bool)
    go do_stuff(done)
    <-done
}

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
}

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")
}

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!

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