Sobes.tech
Middle

Kuidas tõhusalt käivitada ja hallata suurt hulka goroutine, näiteks umbes 100 000?

sobes.tech AI

Vastus AI-lt

Efektiivseks käivitamiseks ja umbes 100 000 gorutini haldamiseks Go keeles on oluline arvestada mitmete aspektidega:

  1. Tööjõu basseinide kasutamine — selle asemel, et käivitada kõik gorutini korraga, looge fikseeritud suurusega bassein (näiteks paar sada) ja jaotage ülesanded nende vahel. See vähendab plaanija koormust ja mälu kasutust.

  2. Resursside kontroll — gorutined on kergekaalulised, kuid igaüks kasutab stakki (vaikimisi paar kilobaiti), seega on oluline vältida liiga paljude korraga käivitamist ilma kontrollita.

  3. Kanaleid kasutades sünkroniseerimiseks — gorutinite elutsükli haldamine ja andmete edastamine nende vahel.

  4. Kontekst (context.Context) — tühistamiseks ja ajapiiranguteks.

Näide lihtsast tööjõu basseinist:

package main

import (
    "fmt"
    "sync"
)

func worker(id int, jobs <-chan int, results chan<- int, wg *sync.WaitGroup) {
    defer wg.Done()
    for j := range jobs {
        // Ülesande töötlemine
        results <- j * 2
    }
}

func main() {
    const numJobs = 100000
    const numWorkers = 100

    jobs := make(chan int, numJobs)
    results := make(chan int, numJobs)

    var wg sync.WaitGroup

    for w := 1; w <= numWorkers; w++ {
        wg.Add(1)
        go worker(w, jobs, results, &wg)
    }

    for j := 1; j <= numJobs; j++ {
        jobs <- j
    }
    close(jobs)

    wg.Wait()
    close(results)

    // Tulemuste töötlemine
    count := 0
    for r := range results {
        _ = r // tulemuse kasutamine
        count++
    }
    fmt.Println("Töödeldud ülesannete arv:", count)
}

Selline lähenemine võimaldab tõhusalt hallata suure hulga ülesandeid piiratud gorutinite arvuga.