Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengehadkan Pelaksanaan Goroutine Serentak dalam Go?

Bagaimana untuk Mengehadkan Pelaksanaan Goroutine Serentak dalam Go?

Linda Hamilton
Linda Hamiltonasal
2024-11-02 05:27:02964semak imbas

How to Limit Concurrent Goroutine Execution in Go?

Mengehadkan Pelaksanaan Goroutine Serentak

Pertimbangkan senario di mana anda mempunyai senarai URL untuk diproses dan ingin mengehadkan bilangan goroutine serentak berjalan . Contohnya, jika anda mempunyai 30 URL, anda mungkin hanya mahu 10 gorouti berfungsi selari.

Kod yang disediakan cuba menggunakan saluran penimbal bersaiz selari untuk mengehadkan bilangan gorouti yang berjalan . Walau bagaimanapun, pendekatan ini nampaknya tidak menyekat selepas memproses semua URL. Cara yang lebih berkesan untuk mencapai pengehadan konkurensi ini ialah dengan mencipta bilangan goroutin pekerja yang ditentukan dan memberi mereka URL melalui saluran khusus.

Berikut ialah versi kod yang dipertingkatkan:

<code class="go">parallel := flag.Int("parallel", 10, "max parallel requests allowed")
flag.Parse()
urls := flag.Args()

// Create a channel to hold URLs that workers will consume
workerURLChan := make(chan string)

// Start a goroutine to feed URLs to the workers
go func() {
    for _, u := range flag.Args() {
        workerURLChan <- u
    }

    // Once all URLs have been distributed, close the channel, which will cause workers to exit
    close(workerURLChan)
}()

var wg sync.WaitGroup
client := rest.Client{}

results := make(chan string)

// Start the specified number of worker goroutines
for i := 0; i < *parallel; i++ {
    wg.Add(1)
    go func() {
        defer wg.Done()

        // Workers repeatedly fetch URLs from the channel until it is closed
        for url := range workerURLChan {
            worker(url, client, results)
        }
    }()
}

// Close the results channel when all workers have completed, which will allow the main goroutine to exit
go func() {
    wg.Wait()
    close(results)
}()

// Receive and print results from the worker goroutines
for res := range results {
    fmt.Println(res)
}</code>

Dalam kod yang dikemas kini ini, kami mencipta goroutine pekerja untuk setiap pelaksanaan serentak yang dibenarkan, dan pekerja ini mengambil URL daripada saluran khusus. Setelah semua URL telah diedarkan, workerURLChan ditutup, yang mencetuskan pekerja untuk keluar apabila URL semasa mereka selesai. Mekanisme ini mengehadkan bilangan gorout serentak berjalan dengan berkesan.

Atas ialah kandungan terperinci Bagaimana untuk Mengehadkan Pelaksanaan Goroutine Serentak dalam Go?. 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