Горутины отличаются от потоков (тредов) следующими ключевыми аспектами:
- Управление: Горутины управляются средой выполнения Go, в то время как потоки управляются операционной системой. Это делает переключение между горутинами значительно более легким и быстрым, поскольку не требует переключения контекста ядра.
- Затраты: Создание и управление горутинами требует гораздо меньше ресурсов (памяти и времени) по сравнению с потоками. Горутина начинается с очень маленького стека (несколько килобайт), который может динамически расти или уменьшаваться по мере необходимости, в то время как потоки имеют фиксированный, часто намного больший стек.
- Масштабируемость: Благодаря низким затратам, можно легко создать сотни тысяч или даже миллионы горутин в одном приложении, тогда как создание такого же количества потоков быстро исчерпает системные ресурсы.
- Планирование: Планировщик Go мультиплексирует большое количество горутин на меньшем количестве потоков ОС. Это реализует кооперативную многозадачность между горутинами на одном потоке ОС (хотя и с элементами вытеснения), в то время как потоки ОС управляются планировщиком операционной системы, который использует вытесняющую многозадачность.
| Аспект | Горутины | Потоки (Треды) |
|---|
| Управление | Среда выполнения Go | Операционная система |
| Затраты | Низкие (память, время) | Высокие (память, время) |
| Масштабируемость | Очень высокая | Ограниченная системными ресурсами |
| Планирование | Планировщик Go (кооперативное) | Планировщик ОС (вытесняющее) |
| Стек | Динамический, малый | Фиксированный, часто большой |
Пример создания горутины:
go