Sobes.tech
Junior — Middle

Оё имкон дорад, ки миқдори goroutine-ҳои ҳамзамон дар барнома маҳдуд карда шаванд?

sobes.tech AI

Ҷавоб аз AI

Дар забони Go, механизм дарунсохташуда барои муқаррар кардани миқдори қатъии goroutine-ҳо, ки ҳамзамон оғоз мешаванд, вуҷуд надорад. Миқдори зиёде goroutine-ҳо метавонанд бошанд ва нақшабарорӣ ва гузаронидани онҳо аз ҷониби runtime-и Go идора карда мешавад.

Аммо, агар хоҳед, ки шумораи goroutine-ҳо, ки ҳамзамон иҷро мешаванд, маҳдуд кунед (масалан, барои назорати истифодаи захираҳо), метавонед семафорҳо ё каналҳоро барои маҳдуд кардани параллелизм истифода баред.

Масалан, маҳдуд кардани шумораи goroutine-ҳо, ки ҳамзамон кор мекунанд, бо истифода аз канал:

package main

import (
    "fmt"
    "sync"
)

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // дастрасӣ ба манбаъ
    fmt.Printf("Goroutine %d оғоз ёфт\n", id)
    // ... кор ...
    fmt.Printf("Goroutine %d тамом шуд\n", id)
    <-sem // озод кардани манбаъ
}

func main() {
    const maxGoroutines = 5
    sem := make(chan struct{}, maxGoroutines)
    var wg sync.WaitGroup

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

    wg.Wait()
}

Дар ин мисол, бештар аз 5 goroutine ҳамзамон кор нахоҳад кард.