Matlamat anda adalah untuk menggunakan goroutin dalam Pergi ke memproses item secara selari, mengumpul keputusannya menjadi kepingan. Walau bagaimanapun, anda mengalami ralat kebuntuan yang membingungkan: "semua goroutine sedang tidur - kebuntuan!"
Ralat berpunca daripada dua isu dalam kod anda:
Untuk membetulkan isu ini, perkenalkan goroutine yang menutup saluran secara tak segerak apabila pekerja selesai:
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 { .. }
Jika anda memerlukan bilangan pekerja tetap untuk kecekapan optimum, faktorkan semula kod seperti berikut:
for i, line := range contents { wg.Add(1) go func(line string) { defer wg.Done() sampleChan <- newSample(line, *replicatePtr, *timePtr) }(line) }
Ini mengekalkan primitif konkurensi bersama-sama dan memudahkan pemfaktoran semula untuk pelbagai corak konkurensi.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Kebuntuan Apabila Menggunakan Goroutines untuk Pemprosesan Selari dan Pengumpulan Hasil?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!