Sobes.tech
Middle

Чӣ гуна метавон ба таври муассир шумораи зиёди goroutine-ҳоро оғоз ва идора кард, масалан, тақрибан 100 ҳазор?

sobes.tech AI

Ҷавоб аз AI

Барои оғоз ва идоракунии муассиронаи тақрибан 100,000 goroutine дар Go, муҳим аст, ки чанд ҷиҳатро ба назар гиред:

  1. Истифодаи пули коргарон (worker pool) — ба ҷои оғоз кардани ҳамаи goroutine-ҳо ҳамзамон, як пул бо андозаи муайян (масалан, чанд сад) созед ва вазифаҳоро байни онҳо тақсим кунед. Ин борро ба нақшаёр кам мекунад ва истифодаи хотираро камтар мекунад.

  2. Назорати захираҳо — goroutine-ҳо сабуканд, аммо ҳар яке як стек (аз пешфарз, чанд килобайт) истифода мебарад, бинобар ин муҳим аст, ки аз оғоз кардани зиёда аз ҳад зиёд бидуни назорат худдорӣ кунед.

  3. Истифодаи каналҳо барои ҳамоҳангсозӣ — барои идоракунии давраи зиндагии goroutine-ҳо ва интиқоли маълумот байни онҳо.

  4. Мавзӯъ (context.Context) — барои бекор кардан ва маҳдудиятҳои вақт.

Маслиҳати оддӣ барои пули коргарон:

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 {
        // Коркарди вазифа
        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)

    // Коркарди натиҷаҳо
    count := 0
    for r := range results {
        _ = r // истифодаи натиҷа
        count++
    }
    fmt.Println("Санади коркардашуда:", count)
}

Ин усул имкон медиҳад, ки як миқдори зиёди вазифаҳоро бо шумораи маҳдуди goroutine-ҳо самаранок идора кунед.