Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Aplikasi Go Hang Apabila Menggunakan WaitGroups dan Saluran?

Mengapa Aplikasi Go Hang Apabila Menggunakan WaitGroups dan Saluran?

DDD
DDDasal
2024-10-26 08:19:02697semak imbas

Why Do Go Applications Hang When Using WaitGroups and Channels?

Menutup Saluran untuk Aplikasi Keluar Bersih dalam Go Menggunakan WaitGroups

Artikel ini menyiasat isu biasa yang dihadapi apabila menggunakan penyegerakan.WaitGroup dan saluran dalam Go program, yang boleh menghalang fungsi utama daripada keluar selepas semua goroutine telah menyelesaikan tugas mereka. Mari kita terokai masalah dan penyelesaiannya.

Masalah: Tunggu Tak Terhingga

Dalam contoh yang disediakan, fungsi utama menggunakan penyegerakan.WaitGroup dan saluran (fetchedSymbols) untuk mengurus gorout serentak yang mengambil dan menyimpan sebut harga saham. Semasa goroutine menyelesaikan tugas mereka, program itu digantung selama-lamanya tanpa keluar.

Isu: Saluran Tidak Tertutup

Penyebabnya ialah gelung julat dalam fungsi utama . Mengulangi saluran fetchedSymbols menyekat kemajuan kerana saluran itu tidak pernah ditutup. Akibatnya, fungsi utama menunggu selama-lamanya untuk nilai baharu dihantar melalui saluran, walaupun semua nilai telah diterima.

Penyelesaian: Menutup Saluran

Untuk menyelesaikan isu ini, adalah penting untuk menutup saluran fetchedSymbols setelah semua goroutine menyelesaikan tugas mereka. Ini memberi isyarat kepada gelung julat bahawa tiada lagi nilai untuk diterima, membenarkan lelaran ditamatkan dan fungsi utama diteruskan.

Satu pendekatan ialah menggunakan kaedah Tunggu penyegerakan.WaitGroup untuk memberi isyarat apabila semua goroutine telah selesai. Satu goroutine boleh dilancarkan untuk menunggu WaitGroup mencapai sifar dan kemudian menutup saluran.

<code class="go">go func() {
    wg.Wait()
    close(fetchedSymbols)
}()</code>

Dengan pengubahsuaian ini, gelung julat dalam fungsi utama akhirnya akan mencapai penghujung saluran, membenarkan atur cara untuk mencetak mesej "selesai" dan keluar dengan anggun.

Dengan memahami kepentingan menutup saluran apabila bekerja dengan penyegerakan.WaitGroup, pembangun Go boleh memastikan bahawa aplikasi mereka ditamatkan secara dijangka selepas melaksanakan tugasan serentak.

Atas ialah kandungan terperinci Mengapa Aplikasi Go Hang Apabila Menggunakan WaitGroups dan Saluran?. 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