Как запустить 100 тыс. горутин
1️⃣ Как кратко ответить
Для запуска 100 тыс. горутин в Go, используйте цикл, в котором вызывается функция go для каждой горутины. Убедитесь, что используете синхронизацию, например, sync.WaitGroup, чтобы дождаться завершения всех горутин.
2️⃣ Подробное объяснение темы
Горутины — это легковесные потоки выполнения в Go, которые позволяют выполнять функции параллельно. Они очень эффективны по памяти и времени, что делает их идеальными для задач, требующих высокой степени параллелизма.
Зачем запускать 100 тыс. горутин?
Запуск большого количества горутин может быть полезен в сценариях, где требуется обработка множества независимых задач, таких как обработка сетевых запросов, выполнение вычислений или работа с большими объемами данных. Горутины позволяют эффективно использовать ресурсы процессора и памяти.
Как это работает?
Горутины управляются планировщиком Go, который распределяет их выполнение между доступными потоками операционной системы. Это позволяет запускать тысячи горутин одновременно без значительных накладных расходов.
Пример кода
Вот пример, как можно запустить 100 тыс. горутин и дождаться их завершения:
package main
import (
"fmt"
"sync"
)
func main() {
// Создаем экземпляр sync.WaitGroup для ожидания завершения всех горутин
var wg sync.WaitGroup
// Определяем количество горутин
const numGoroutines = 100000
// Устанавливаем счетчик WaitGroup на количество горутин
wg.Add(numGoroutines)
// Запускаем цикл для создания горутин
for i := 0; i < numGoroutines; i++ {
// Запускаем горутину
go func(i int) {
// Отмечаем выполнение горутины
defer wg.Done()
// Выполняем какую-то работу, например, выводим номер горутины
fmt.Printf("Горутина %d завершена\n", i)
}(i)
}
// Ожидаем завершения всех горутин
wg.Wait()
// Выводим сообщение о завершении всех горутин
fmt.Println("Все горутины завершены")
}
Пояснение кода
-
Импорт пакетов: Импортируем пакеты
fmtдля вывода иsyncдля использованияWaitGroup. -
Создание
WaitGroup:sync.WaitGroupиспользуется для ожидания завершения всех горутин. Мы создаем его экземплярwg. -
Установка счетчика:
wg.Add(numGoroutines)устанавливает счетчикWaitGroupна количество горутин, которые мы собираемся запустить. -
Цикл запуска горутин: Используем цикл
for, чтобы запустить 100 тыс. горутин. В каждой итерации запускается новая горутина с помощьюgoи анонимной функции. -
Отметка завершения горутины: Внутри каждой горутины вызывается
defer wg.Done(), чтобы уменьшить счетчикWaitGroupна 1 после завершения работы горутины. -
Выполнение работы: В данном примере каждая горутина просто выводит свой номер, но здесь можно выполнять любую необходимую работу.
-
Ожидание завершения:
wg.Wait()блокирует выполнение основной программы до тех пор, пока счетчикWaitGroupне станет равным нулю, что означает завершение всех горутин. -
Вывод завершения: После завершения всех горутин выводится сообщение о завершении.
Этот код демонстрирует, как эффективно управлять большим количеством параллельных задач в Go с использованием горутин и sync.WaitGroup.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться