Простое ограничение на количество Goroutine
Для отслеживания количества goroutine в программе можно использовать пакет runtime. Он предоставляет функцию NumGoroutine(), которая возвращает текущее количество goroutine в программе.
package main import ( "fmt" "runtime" ) func main() { // Получаем текущее количество goroutine num := runtime.NumGoroutine() fmt.Println("Количество goroutine:", num) // Ограничиваем количество goroutine maxGoroutines := 10 semaphore := make(chan struct{}, maxGoroutines) for i := 0; i < 100; i++ { semaphore <- struct{}{} // Захватываем слот в семафоре go func() { // Выполняем работу // ... <-semaphore // Освобождаем слот в семафоре }() } // Ожидаем завершения всех goroutine for i := 0; i < maxGoroutines; i++ { semaphore <- struct{}{} } // Получаем текущее количество goroutine num = runtime.NumGoroutine() fmt.Println("Количество goroutine:", num) }
В этом примере мы используем семафор для ограничения количества одновременно выполняющихся goroutine до 10. Мы создаем канал semaphore с емкостью 10 и захватываем слот перед запуском каждой goroutine. После выполнения работы goroutine освобождает слот в семафоре. В конце программы мы ожидаем освобождения всех слотов в семафоре, чтобы убедиться, что все goroutine завершились.
Обратите внимание, что ограничение количества goroutine может быть полезно для предотвращения перегрузки системы, но может также привести к ухудшению производительности, если количество goroutine слишком мало для эффективного использования ресурсов. Поэтому важно выбирать подходящее значение для maxGoroutines в зависимости от требований вашей программы.