Junior
Каква е разликата между горутините и нишките (threads)?
sobes.tech AI
Отговор от AI
Горутините се различават от нишките (тредовете) по следните ключови аспекти:
- Управление: Горутините се управляват от средата за изпълнение на Go, докато нишките се управляват от операционната система. Това прави превключването между горутините много по-леко и по-бързо, тъй като не изисква превключване на контекста на ядрото.
- Разходи: Създаването и управлението на горутините изисква много по-малко ресурси (памет и време) в сравнение с нишките. Една горутина започва с много малък стек (няколко килобайта), който може да расте или намалява динамично според нуждите, докато нишките имат фиксиран, често много по-голям стек.
- Мащабируемост: Благодарение на ниските разходи, лесно е да се създадат стотици хиляди или дори милиони горутини в едно приложение, докато създаването на същото количество нишки бързо ще изчерпи системните ресурси.
- Планиране: Планировчикът на Go мултиплексира много горутини върху по-малко брой нишки на ОС. Това реализира кооперативна многозадачност между горутините на един нишков (макар и с елементи на принудително прекъсване), докато нишките на ОС се управляват от планировчика на операционната система, който използва принудително многозадачност.
| Аспект | Горутиини | Нишки (тредове) |
|---|---|---|
| Управление | Среда за изпълнение на Go | Операционна система |
| Разходи | Ниски (памет, време) | Високи (памет, време) |
| Мащабируемост | Много висока | Ограничена от системните ресурси |
| Планиране | Планировчик на Go (кооперативен) | Планировчик на ОС (принудителен) |
| Стек | Динамичен, малък | Фиксиран, често голям |
Пример за създаване на горутина:
package main
import (
"fmt"
"time"
)
func задача(ид int) {
fmt.Printf("Горутина %d започна\n", ид)
time.Sleep(1 * time.Second)
fmt.Printf("Горутина %d приключи\n", ид)
}
func main() {
go задача(1) // Създаване на горутина
go задача(2) // Създаване на друга горутина
time.Sleep(2 * time.Second) // Изчакваме горутините да приключат
fmt.Println("Главната горутина е приключила")
}