Sobes.tech
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("Главната горутина е приключила")
}