Bagaimana Mengelakkan Kebuntuan Apabila Menggunakan Goroutines untuk Memproses Nilai dan Mengumpul Hasil Menjadi Sekeping?

DDD
Lepaskan: 2024-11-06 17:56:02
asal
983 orang telah melayarinya

How to Avoid Deadlock When Using Goroutines to Process Values and Gather Results into a Slice?

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)
Salin selepas log masuk
  • Groutine ini secara serentak memproses data dan menghantar hasilnya ke saluran bernama sampleChan.
// Read from sampleChan and put into a slice
for s := range sampleChan {
    sampleList = append(sampleList, s)
}
close(sampleChan)
Salin selepas log masuk
  • Kod cuba mengumpulkan hasil daripada saluran dan memasukkannya ke dalam kepingan.

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)
}()
Salin selepas log masuk
  • Tangguhkan penutupan saluran sehingga selepas pekerja selesai dengan memulakan goroutine berasingan.

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

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!