Ответ
Горутина будет эффективнее на многопроцессорных системах благодаря планировщику Go (Goroutine Scheduler), который распределяет горутины по доступным ядрам. Потоки ОС тяжелее (1-2 МБ стека vs 2-8 КБ у горутин) и создают больше накладных расходов при переключении контекста.
Пример:
// Горутины (масштабируются на все ядра)
for i := 0; i < 1000; i++ {
go worker() // Легковесные
}
// Потоки (ограничены числом ядер)
runtime.GOMAXPROCS(16) // Максимум 16 потоков
На 16 ядрах горутины автоматически распределятся по всем ядрам, тогда как потоки будут ограничены GOMAXPROCS. Разница особенно заметна при большом количестве задач (>10k).