Sobes.tech
Junior — Middle

Go dilində eyni vaxtda işləyən goroutinlərin sayının limitini necə müəyyən etmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

Go dilində, birbaşa işləyən gorutinlərin sayını məhdudlaşdırmaq üçün daxili mexanizm yoxdur. Ancaq, paralelliyi idarə etmək üçün adətən semaforlar və ya məhdudiyyətli tutuma malik kanallar istifadə olunur.

Bir kanal vasitəsilə eyni vaxtda işləyən gorutinlərin sayını məhdudlaşdırma nümunəsi:

package main

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

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // yer ayır
    fmt.Printf("Goroutine %d işə başladı\n", id)
    time.Sleep(time.Second) // işin simulyasiyası
    fmt.Printf("Goroutine %d işini bitirdi\n", id)
    <-sem // yer boşaldır
}

func main() {
    const maxGoroutines = 3
    sem := make(chan struct{}, maxGoroutines) // tamponlu kanal, gorutinlərin sayını məhdudlaşdırır
    var wg sync.WaitGroup

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

Bu nümunədə, sem adlı kanal maxGoroutines tamponu ilə eyni vaxtda işləyən gorutinlərin sayını məhdudlaşdırır. Hər bir goroutine işə başlamazdan əvvəl kanala boş strukturu yerləşdirir, yer tutaraq və işi bitdikdən sonra onu azad edir. Beləliklə, eyni vaxtda ən çox maxGoroutines gorutini işləyə bilər.