Rumah > pembangunan bahagian belakang > Golang > Mengapa My Go WaitGroup Tidak Selesai Apabila Memuat Turun Fail Secara serentak?

Mengapa My Go WaitGroup Tidak Selesai Apabila Memuat Turun Fail Secara serentak?

Barbara Streisand
Lepaskan: 2024-11-28 07:35:12
asal
747 orang telah melayarinya

Why Doesn't My Go WaitGroup Complete When Downloading Files Concurrently?

WaitGroup Tidak Selesai dalam Go Concurrency

Kod yang disediakan cuba memuat turun dan menyimpan berbilang fail secara serentak daripada senarai URL. Walau bagaimanapun, goroutine utama tidak pernah ditamatkan kerana penyegerakan.WaitGroup tidak pernah selesai.

Dua Isu Dikenalpasti:

  1. Isu Penyegerakan:
    Dalam muat turunFromURL(), panggilan wg.Done() sepatutnya digunakan sebagai salah satu pernyataan pertama, bukan pada akhir fungsi. Ini memastikan WaitGroup berkurangan dengan betul walaupun fungsi itu kembali awal.
  2. Penunjuk Concurrency:
    Fungsi muat turunFromURL() harus menerima penunjuk kepada penyegerakan.WaitGroup untuk memanipulasi perkongsian objek dengan betul. Jika tidak, menghantar WaitGroup mengikut nilai menghasilkan salinan dan perubahan yang dibuat pada salinan tidak akan ditunjukkan dalam goroutine utama.

Kod Dioptimumkan:

func downloadFromURL(url string, wg *sync.WaitGroup) error {
    defer wg.Done()  // Moved to the beginning of the function

    ... // Other code
}

func main() {
    ...

    for _, url := range links {
        if isExcelDocument(url) {
            wg.Add(1)
            go downloadFromURL(url, &wg)  // Pass pointer to WaitGroup
        } else {
            fmt.Printf("Skipping: %v \n", url)
        }
    }
    ...
}
Salin selepas log masuk

Dengan menangani isu ini, WaitGroup akan menjejaki bilangan goroutine yang sedang berjalan dengan tepat dan goroutine akan ditamatkan setelah semua muat turun selesai.

Atas ialah kandungan terperinci Mengapa My Go WaitGroup Tidak Selesai Apabila Memuat Turun Fail Secara serentak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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