Back to questions
Junior — Middle
76
Возможна ли установка лимита на число одновременно работающих потоков в языке Go?
Answer from AI
sobes.tech 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("Worker %d started\n", id)
time.Sleep(time.Second) // Работа
fmt.Printf("Worker %d finished\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 с буфером maxConcurrent ограничивает число одновременно работающих горутин до 3.