Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengelakkan Kebuntuan Apabila Menggunakan Goroutines untuk Pemprosesan Selari dan Pengumpulan Hasil?

Bagaimana untuk Mengelakkan Kebuntuan Apabila Menggunakan Goroutines untuk Pemprosesan Selari dan Pengumpulan Hasil?

Barbara Streisand
Barbara Streisandasal
2024-11-07 02:09:03557semak imbas

How to Avoid Deadlocks When Using Goroutines for Parallel Processing and Result Gathering?

Memahami Goroutine untuk Pemprosesan Selari dan Pengumpulan Hasil

Latar Belakang

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!"

Penyelesaian

Ralat berpunca daripada dua isu dalam kod anda:

  1. Koleksi Tertunda: Anda sedang menunggu semua goroutine selesai sebelum mengumpul keputusan, yang mana adalah salah.
  2. Penutupan Saluran Pramatang: Saluran ditutup selepas pengumpulan keputusan gelung selesai, menamatkan lelaran secara pramatang.

Kod Disemak

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 {
  ..
}

Penjelasan

  • Penutupan Saluran Asynchronous: Goroutine tanpa nama menutup saluran selepas semua pekerja selesai, mengelakkan penamatan gelung pramatang.
  • Syor Gaya : Pertimbangkan untuk menggunakan fungsi pembantu segerak (newSample) yang tidak mengambil saluran dan kumpulan tunggu, memudahkan kod dan meningkatkan kebolehujian.

Pemfaktoran Semula untuk Kecekapan

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!

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