Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Goroutine Saya Ditamatkan Sebelum Pelaksanaan?

Mengapa Goroutine Saya Ditamatkan Sebelum Pelaksanaan?

Barbara Streisand
Barbara Streisandasal
2024-10-30 10:59:02945semak imbas

Why Is My Goroutine Terminating Before Execution?

Mengapa Goroutine Saya Tidak Berjalan?

Dalam bidang pengaturcaraan Go, goroutine menyediakan mekanisme yang berkuasa untuk pelaksanaan serentak. Walau bagaimanapun, kadangkala goroutine ini mungkin kelihatan tidak responsif, menyebabkan pembangun berada dalam keadaan kekeliruan.

Senario:

Pertimbangkan kod Go berikut yang cuba membuat goroutine dan menghantar mesej melalui saluran:

<code class="go">package main
import "fmt"
func main(){

messages := make(chan string,3)

messages <- "one"
messages <- "two"
messages <- "three"

go func(m *chan string) {
    fmt.Println("Entering the goroutine...")
    for {
        fmt.Println(<- *m)
    }
}(&messages)

fmt.Println("Done!")
}</code>

Apabila melaksanakan kod ini, output mungkin mengejutkan:

Done!

Masalahnya:

Walaupun mencipta goroutine, kod itu tidak pernah melaksanakan pernyataan di dalamnya. Sebabnya terletak pada penamatan program utama. Dalam Go, goroutine berjalan secara bebas daripada fungsi utama. Sebaik sahaja program utama keluar, semua goroutine yang sedang berjalan ditamatkan, walaupun mereka tidak mempunyai peluang untuk melaksanakan.

Penyelesaian:

Untuk mengelakkan goroutine daripada ditamatkan sebelum waktunya, program utama mesti terus hidup sehingga goroutine selesai kerjanya. Terdapat beberapa pendekatan untuk mencapai ini:

  • Saluran: Cipta saluran kedua untuk menunggu mesej daripada goroutine, dengan berkesan menyekat program utama sehingga mesej diterima.
  • Penyegerakan: Gunakan penyegerakan.WaitGroup atau mekanisme penyegerakan serupa untuk memberi isyarat apabila goroutine telah menyelesaikan tugasnya.
  • Pemasa: Cipta pemasa untuk tunggu untuk tempoh tertentu, pastikan goroutine mempunyai masa yang mencukupi untuk dilaksanakan.

Cadangan:

Untuk pemahaman yang lebih menyeluruh tentang tingkah laku dan kesesuaian goroutine dalam Pergi, sangat disyorkan untuk membaca catatan blog yang sangat baik di blog Golang: "Concurrency in Go."

Atas ialah kandungan terperinci Mengapa Goroutine Saya Ditamatkan Sebelum Pelaksanaan?. 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