Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengekalkan Bilangan Tetap Goroutine Serentak dalam Go?

Bagaimana untuk Mengekalkan Bilangan Tetap Goroutine Serentak dalam Go?

DDD
DDDasal
2024-12-06 09:15:10437semak imbas

How to Maintain a Fixed Number of Concurrent Goroutines in Go?

Mengekalkan Bilangan Tetap Goroutine Serentak

Dalam Go, anda mungkin menghadapi senario yang mengawal bilangan goroutin yang berjalan serentak adalah penting. Walaupun tutorial sering menumpukan pada menunggu gorouti disiapkan, mencapai bilangan tertentu gorouti aktif pada bila-bila masa memberikan cabaran yang berbeza.

Pertimbangkan situasi berikut: anda mempunyai ratusan ribu tugasan untuk diproses. Memproses setiap tugas memerlukan goroutine sendiri, tetapi sumber sistem anda hanya boleh mengendalikan maksimum 20 goroutine serentak. Anda perlu memastikan bahawa sentiasa ada 20 gorouti yang sedang berjalan, melancarkan yang baharu apabila yang sedia ada selesai.

Sejajar Terbatas

Untuk mencapai matlamat ini, Corak Go Concurrency artikel mencadangkan menggunakan corak yang dipanggil "Paralelisme Terbatas." Ia melibatkan penggunaan saluran struct kosong sebagai pengawal untuk mengehadkan bilangan pekerja serentak.

Pelaksanaan

Berikut ialah contoh yang menunjukkan cara melaksanakan corak ini:

package main

import (
    "fmt"
    "sync"
)

func main() {
    const maxGoroutines = 20

    // Create a channel of empty structs to control worker count
    guard := make(chan struct{}, maxGoroutines)

    var wg sync.WaitGroup

    // Launch workers
    for i := 0; i < 30; i++ {
        wg.Add(1)
        guard <- struct{}{} // Blocks if guard channel is filled
        go func(n int) {
            defer wg.Done()
            worker(n)
            <-guard // Release slot in guard channel
        }(i)
    }
    wg.Wait()
}

func worker(i int) { fmt.Println("doing work on", i) }

Dalam contoh ini, saluran pengawal digunakan sebagai baldi token. Bilangan maksimum goroutin yang boleh dijalankan serentak dihadkan oleh kapasiti saluran (20 dalam kes ini). Setiap goroutine memperoleh "token" (struktur kosong) daripada saluran sebelum memulakan kerja. Apabila goroutine selesai, ia mengeluarkan tokennya kembali ke saluran, menjadikannya tersedia untuk goroutine lain untuk diperoleh. Dengan mengawal bilangan token dalam saluran, anda mengawal bilangan goroutin serentak dengan berkesan.

Atas ialah kandungan terperinci Bagaimana untuk Mengekalkan Bilangan Tetap 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