← Назад ко всем вопросам

Как запустить 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("Все горутины завершены")
}

Пояснение кода

  1. Импорт пакетов: Импортируем пакеты fmt для вывода и sync для использования WaitGroup.

  2. Создание WaitGroup: sync.WaitGroup используется для ожидания завершения всех горутин. Мы создаем его экземпляр wg.

  3. Установка счетчика: wg.Add(numGoroutines) устанавливает счетчик WaitGroup на количество горутин, которые мы собираемся запустить.

  4. Цикл запуска горутин: Используем цикл for, чтобы запустить 100 тыс. горутин. В каждой итерации запускается новая горутина с помощью go и анонимной функции.

  5. Отметка завершения горутины: Внутри каждой горутины вызывается defer wg.Done(), чтобы уменьшить счетчик WaitGroup на 1 после завершения работы горутины.

  6. Выполнение работы: В данном примере каждая горутина просто выводит свой номер, но здесь можно выполнять любую необходимую работу.

  7. Ожидание завершения: wg.Wait() блокирует выполнение основной программы до тех пор, пока счетчик WaitGroup не станет равным нулю, что означает завершение всех горутин.

  8. Вывод завершения: После завершения всех горутин выводится сообщение о завершении.

Этот код демонстрирует, как эффективно управлять большим количеством параллельных задач в Go с использованием горутин и sync.WaitGroup.

Тема: Конкурентность
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки