Mengumpul Hasil daripada Goroutines menjadi Sekeping
Menggunakan goroutine untuk memproses data secara serentak dan mengumpulkan hasil boleh mencabar, terutamanya apabila menguruskan concurrency dan thread keselamatan. Dalam kod anda, anda mengalami ralat jalan buntu kerana kumpulan tunggu diberi isyarat untuk menunggu semua gorout selesai sebelum mengumpul keputusan.
Untuk menyelesaikan isu ini, kami perlu menutup saluran keputusan secara tidak segerak selepas semua gorout selesai tugasan mereka. Berikut ialah versi kod anda yang diubah suai:
for i, line := range contents { wg.Add(1) go newSample(line, *replicatePtr, *timePtr, sampleChan, &wg) } go func() { wg.Wait() close(sampleChan) }() for s := range sampleChan { // Process results }
Perubahan ini memastikan saluran keputusan ditutup apabila semua goroutine telah selesai, membolehkan kami mengumpulkan hasil dengan betul.
Selain itu, untuk dipertingkatkan kejelasan kod dan kebolehujian, adalah disyorkan untuk memfaktorkan semula newSample menjadi fungsi segerak yang menjana hasil daripada mengambil kumpulan tunggu dan saluran. Ini membolehkan pemisahan yang lebih bersih bagi kebimbangan bersamaan dan ujian yang lebih mudah.
Dengan melaksanakan pelarasan ini, anda boleh mengumpulkan hasil daripada gorout anda dengan cekap dan mengelakkan ralat kebuntuan.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Kebuntuan Apabila Mengumpul Hasil daripada Goroutines ke dalam Slice?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!