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

Mengapa Goroutine Saya Ditamatkan Sebelum Pelaksanaan?

Barbara Streisand
Lepaskan: 2024-10-30 10:59:02
asal
1030 orang telah melayarinya

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

Apabila melaksanakan kod ini, output mungkin mengejutkan:

Done!
Salin selepas log masuk

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!

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