Menggunakan Goroutines untuk Memproses Nilai dengan Cekap dan Mengumpul Hasil Menjadi Sekeping
Penggunaan goroutine boleh menjadi elemen transformatif dalam pengaturcaraan Go, membolehkan pelaksanaan tugas serentak dan pemprosesan yang cekap. Walau bagaimanapun, pelaksanaan yang betul adalah penting untuk mengelakkan kemungkinan perangkap.
Masalah:
Apabila cuba menggunakan goroutin dalam pangkalan kod, "ralat maut: semua gorouti sedang tidur - kebuntuan!" timbul. Matlamatnya adalah untuk memproses nilai dalam senarai secara serentak, seterusnya mengumpul hasil yang diproses ke dalam senarai baharu. Kesukaran, bagaimanapun, muncul dalam fasa pengumpulan.
Penguraian Kod:
Coretan kod yang disediakan termasuk beberapa elemen penting:
// Process each item with a goroutine and send output to sampleChan go newSample(line, *replicatePtr, *timePtr, sampleChan, &wg)
// Read from sampleChan and put into a slice for s := range sampleChan { sampleList = append(sampleList, s) } close(sampleChan)
Penyelesaian:
Ralat disebabkan oleh dua isu: menunggu pramatang untuk pekerja siap dan masa penutupan saluran yang tidak betul. Pengubahsuaian berikut menyelesaikan isu ini:
go func() { wg.Wait() close(sampleChan) }()
Selain itu, untuk perpaduan gaya, pertimbangkan penstrukturan semula newSample sebagai fungsi segerak untuk pengeluaran hasil, menghasilkan kod berikut:
for i, line := range contents { wg.Add(1) go func(line string) { defer wg.Done() sampleChan <- newSample(line, *replicatePtr, *timePtr) }(line) }
Pendekatan yang disemak ini meningkatkan kebolehbacaan kod, memudahkan ujian dan memudahkan pengurusan konkurensi, membolehkan pengenalpastian jelas bagi operasi kritikal seperti wg.Done( ).
Atas ialah kandungan terperinci Bagaimana Mengelakkan Kebuntuan Apabila Menggunakan Goroutines untuk Memproses Nilai dan Mengumpul Hasil Menjadi Sekeping?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!