Sobes.tech
Junior — Middle

Ինչպե՞ս որոշել միաժամանակ գործարկվող goroutine-ների քանակի սահմանը Go լեզվում։

sobes.tech AI

Պատասխան AI-ից

Go լեզվում չկա ներմուծված մեխանիզմ ուղղակիորեն սահմանափակելու համար միաժամանակ աշխատող goroutinների քանակը։ Սակայն, որպեսզի վերահսկել պարալելիզմի սահմանը, սովորաբար օգտագործում են սեմաֆորներ կամ սահմանափակ ծավալով ալիքներ։

Օրինակ՝ սահմանափակելու միաժամանակ աշխատող goroutinների քանակը ալիքով՝

package main

import (
    "fmt"
    "sync"
    "time"
)

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // զբաղեցնում ենք տեղ
    fmt.Printf("Goroutine %d սկսեց աշխատել\n", id)
    time.Sleep(time.Second) // աշխատանքային սիմուլացիա
    fmt.Printf("Goroutine %d ավարտեց աշխատանքը\n", id)
    <-sem // ազատում ենք տեղ
}

func main() {
    const maxGoroutines = 3
    sem := make(chan struct{}, maxGoroutines) // ալիք՝ սահմանափակելով goroutinների քանակը
    var wg sync.WaitGroup

    for i := 1; i <= 10; i++ {
        wg.Add(1)
        go worker(i, sem, &wg)
    }
    wg.Wait()
}

Այս օրինակով, sem ալիքը, որի բաֆերը maxGoroutines է, սահմանափակում է միաժամանակ աշխատող goroutinների քանակը։ Ամեն goroutine նախքան աշխատանքի մեկնարկը, տեղ է զբաղեցնում ալիքով, իսկ ավարտից հետո ազատում։ Այսպիսով, միաժամանակ աշխատում է ոչ ավել քան maxGoroutines goroutin։