Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana Mengelakkan Kebuntuan Apabila Menggunakan Goroutines untuk Memproses Nilai dan Mengumpul Hasil Menjadi Sekeping?

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

DDD
DDDasal
2024-11-06 17:56:02969semak imbas

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)
  • 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)
  • 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)
}()
  • 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)
}

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!

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