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
Barbara Streisandasal
2024-11-28 07:35:12746semak imbas

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

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:
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