Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengelakkan Kebuntuan Apabila Mengumpul Hasil daripada Goroutines ke dalam Slice?

Bagaimana untuk Mengelakkan Kebuntuan Apabila Mengumpul Hasil daripada Goroutines ke dalam Slice?

Patricia Arquette
Patricia Arquetteasal
2024-11-12 05:59:01539semak imbas

How to Avoid Deadlock When Gathering Results from Goroutines into a Slice?

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!

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