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

Barbara Streisand
Lepaskan: 2024-11-07 02:09:03
asal
483 orang telah melayarinya

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

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

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!

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
Artikel terbaru oleh pengarang
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!