Sobes.tech
Junior — Middle

შესაძლებელია თუ არა ერთდროულად მუშაობა ნაკადების რაოდენობაზე შეზღუდვის დაწესება Go ენაში?

sobes.tech AI

პასუხი AI-სგან

Go ენაში პირდაპირი მექანიზმი არ არსებობს ერთდროულად მუშაობს გორუტინების (სუსტი ძაფების) რაოდენობის პირდაპირი შეზღუდვისთვის. შეიძლება იყოს ბევრი გორუტინი, და ისინი მსუბუქია. ერთდროულად მუშაობს გორუტინების რაოდენობის შეზღუდვისთვის, ჩვეულებრივ, იყენებენ სემაფორებს ან შეზღუდული მოცულობის არხებს.

მაგალითი ერთდროულად მუშაობს გორუტინების რაოდენობის შეზღუდვისთვის არხის გამოყენებით:

package main

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

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // ადგილი დაჯავშნა
    fmt.Printf("მუშაკი %d დაიწყო\n", id)
    time.Sleep(time.Second) // სამუშაო
    fmt.Printf("მუშაკი %d დასრულდა\n", id)
    <-sem // ადგილი გათავისუფლება
}

func main() {
    const maxConcurrent = 3
    sem := make(chan struct{}, maxConcurrent) // არხი შეზღუდვით
    var wg sync.WaitGroup

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

    wg.Wait()
}

აქ, არხი sem with ბუფერი maxConcurrent შეზღუდავს ერთდროულად მუშაობს გორუტინების რაოდენობას 3-ზე.