7 вопросов
Горутины - легковесные потоки, управляемые рантаймом Go. Конкурентность - ключевая сила языка. Важно понимать data race, GOMAXPROCS и утечки горутин.
Горутина - не поток ОС, а легковесный «зелёный поток», управляемый планировщиком Go. Начальный стек ~2 КБ (у потока ОС ~1 МБ). Можно запустить тысячи горутин. Рантайм мультиплексирует горутины на потоки ОС.
Подробнее →Ключевое слово go запускает функцию в новой горутине. Вызов не блокирует - управление сразу возвращается. Работает с любыми функциями и методами, включая анонимные: go func() { ... }().
Подробнее →Когда main() возвращается, процесс завершается - все горутины убиваются. Они не получают сигнала. Для ожидания горутин используйте sync.WaitGroup, каналы или context.
Подробнее →Data race - когда две или более горутины одновременно обращаются к одной переменной и хотя бы одна из них пишет. Результат непредсказуем. Решения: мьютексы, каналы, атомарные операции.
Подробнее →go test -race или go run -race включает детектор гонок. Он замедляет программу, но находит data race во время выполнения. Рекомендуется использовать в CI/CD.
Подробнее →GOMAXPROCS определяет, сколько потоков ОС одновременно выполняют Go-код. По умолчанию равен количеству CPU. Это не лимит горутин - горутин может быть гораздо больше.
Подробнее →Go не имеет механизма принудительного завершения горутин. Если горутина заблокирована (ждёт канал, мьютекс), она останется в памяти до завершения программы. GC не собирает горутины. Используйте context с отменой.
Подробнее →