Этот вопрос проверяет понимание разницы между горутинами и потоками ОС, включая их эффективность и управление.
Горутины легче потоков ОС: они занимают меньше памяти (стек ~2 КБ против ~1 МБ) и переключаются быстрее, так как управляются планировщиком Go, а не ОС. Потоки зависят от ядер CPU, а горутин может быть тысячи на одном потоке.
Горутины — это легковесные потоки, управляемые рантаймом Go, а не ОС.
Ключевые отличия:
Память:
Горутина: стек начинается с ~2 КБ и динамически растёт/сжимается.
Поток ОС: фиксированный стек (обычно 1–8 МБ).
Планирование:
Горутины: переключаются пользовательским планировщиком Go без затрат на системные вызовы.
Потоки: переключаются ядром ОС, что требует больше ресурсов.
Масштабирование:
Горутины: миллионы могут работать на нескольких потоках ОС.
Потоки: ограничены числом ядер CPU (обычно сотни).
Пример:
package main
import (
"fmt"
"time"
)
func worker(id int) {
fmt.Printf("Горутина %d\n", id)
}
func main() {
for i := 0; i < 1000; i++ {
go worker(i) // Запуск 1000 горутин
}
time.Sleep(time.Second) // Даём время на выполнение
}Здесь 1000 горутин работают на нескольких потоках ОС.
Вывод:
Горутины эффективны для задач с высокой конкурентностью, где потоки ОС были бы избыточны.