Sobes.tech
Junior — Middle

Go dilinde aynı anda çalışan goroutine sayısı sınırını nasıl belirlenir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Go dilinde, aynı anda çalışan goroutine sayısını doğrudan sınırlayan yerleşik bir mekanizma yoktur. Ancak, paralellik sınırını kontrol etmek için genellikle semaforlar veya sınırlı kapasiteye sahip kanallar kullanılır.

Bir kanal kullanarak aynı anda çalışan goroutine sayısını sınırlama örneği:

package main

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

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // slot al
    fmt.Printf("Goroutine %d çalışmaya başladı\n", id)
    time.Sleep(time.Second) // çalışma simülasyonu
    fmt.Printf("Goroutine %d çalışma tamamladı\n", id)
    <-sem // slotu serbest bırak
}

func main() {
    const maxGoroutines = 3
    sem := make(chan struct{}, maxGoroutines) // tamponlu kanal, goroutine sayısını sınırlar
    var wg sync.WaitGroup

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

Bu örnekte, sem adlı kanal, maxGoroutines tamponu ile aynı anda çalışan goroutine sayısını sınırlar. Her goroutine, çalışmaya başlamadan önce kanala boş bir yapı koyar, böylece bir slot kapar ve işi bittikten sonra serbest bırakır. Bu sayede, aynı anda en fazla maxGoroutines goroutine çalışabilir.