Rumah > pembangunan bahagian belakang > Golang > Mengapa My Go tidak menyegerakkan.WaitGroup Pernah Selesai?

Mengapa My Go tidak menyegerakkan.WaitGroup Pernah Selesai?

Barbara Streisand
Lepaskan: 2024-11-27 04:57:14
asal
304 orang telah melayarinya

Why Doesn't My Go sync.WaitGroup Ever Complete?

Golang sync.WaitGroup Never Completes

Kod yang disediakan menunjukkan konkurensi dengan mengambil senarai URL dan memuat turun dan menyimpan fail secara bersyarat ke fail sistem. Goroutine utama menunggu untuk semua fail diambil menggunakan penyegerakan.WaitGroup. Walau bagaimanapun, program gagal untuk keluar walaupun selepas melengkapkan semua permintaan.

Untuk memahami isu ini, pertimbangkan kefungsian WaitGroup. Ia mengekalkan kiraan goroutin yang melaksanakan. Jika kiraan pernah mencecah sifar, kumpulan tunggu akan kembali serta-merta, menunjukkan semua goroutine telah menyelesaikan pelaksanaan.

Dalam kod yang diberikan, kaedah WaitGroup's Add digunakan untuk menambah kiraan, manakala kaedah Done digunakan untuk mengurangkannya . Jika kaedah Tambah dipanggil lebih banyak kali daripada kaedah Selesai, atau sebaliknya, WaitGroup tidak akan mencapai sifar, menyebabkan goroutine utama menunggu selama-lamanya.

Terdapat dua ralat dalam kod yang disediakan:

  1. Fungsi muat turunFromURL menerima salinan WaitGroup, bukan penunjuk kepadanya. Ini menyebabkan salinan data dalaman WaitGroup dihantar, jadi sebarang pengubahsuaian yang dibuat padanya dalam fungsi (seperti memanggil Selesai) tidak kelihatan kepada goroutine utama. Untuk membetulkan isu ini, hantar penuding kepada WaitGroup sebaliknya:
func main() {
    ...
    go downloadFromURL(url, &wg)
    ...
}
Salin selepas log masuk
  1. Pernyataan defer wg.Done() tidak diletakkan sebagai pernyataan pertama dalam fungsi downloadFromURL. Jika ralat berlaku atau sebarang logik lain dilaksanakan sebelum memanggil Selesai, operasi pengurangan tidak akan didaftarkan dan kiraan WaitGroup tidak akan mencapai sifar. Untuk membetulkannya, pastikan defer wg.Done() ialah pernyataan pertama dalam fungsi:
func downloadFromURL(url string, wg *sync.WaitGroup) error {
    defer wg.Done()
    ...
}
Salin selepas log masuk

Dengan pembetulan ini dilaksanakan, WaitGroup akan berfungsi dengan betul, mengurangkan kiraannya apabila gorouti melengkapkan tugasan, akhirnya membawa kepada kejayaan keluar goroutine utama.

Atas ialah kandungan terperinci Mengapa My Go tidak menyegerakkan.WaitGroup Pernah 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