Sobes.tech
Junior

Gorutinalar va iplar (treadlar) qanday farq qiladi?

sobes.tech AI

AIdan javob

Gorutinalar quyidagi asosiy jihatlari bilan iplar (threadlar) dan farq qiladi:

  • Boshqarish: Gorutinalar Go bajariladigan muhit tomonidan boshqariladi, iplar esa operatsion tizim tomonidan boshqariladi. Bu gorutinalar o'rtasida o'tishni juda yengil va tez qiladi, chunki yadro kontekstini o'zgartirish talab qilinmaydi.
  • Xarajatlar: Gorutinalarni yaratish va boshqarish ipga qaraganda ancha kam resurslarni (xotira va vaqt) talab qiladi. Gorutina juda kichik stek bilan boshlanadi (bir necha kilobyte), va ehtiyojga qarab dinamik ravishda kengayishi yoki qisqarishi mumkin, iplar esa odatda katta va statik stekga ega.
  • Kengaytirilish: Past xarajatlar tufayli, bir dasturda yuz minglab yoki hatto millionlab gorutinalarni osongina yaratish mumkin, ayniqsa, ayni vaqtda ko'plab iplar tizim resurslarini tezda tugatadi.
  • Rejalashtirish: Go rejalashtiruvchisi ko'plab gorutinalarni kamroq sonli operatsion tizim iplariga multiplex qiladi. Bu, gorutinalar o'rtasida kooperativ ko'p vazifali ishlashni (bir ipda, preemption elementlari bilan) amalga oshiradi, operatsion tizim iplari esa operatsion tizim rejalashtiruvchisi tomonidan boshqariladi va preemptiv ko'p vazifali ishlashni qo'llab-quvvatlaydi.
Jihat Gorutinalar Ip (Threadlar)
Boshqarish Go bajariladigan muhit Operatsion tizim
Xarajatlar Kam (xotira, vaqt) Yuqori (xotira, vaqt)
Kengaytirilish Juda yuqori Tizim resurslari bilan cheklangan
Rejalashtirish Go rejalashtiruvchisi (kooperativ) OS rejalashtiruvchisi (preemptiv)
Stek Dinamik, kichik Statik, odatda katta

Gorutina yaratish misoli:

package main

import (
	"fmt"
	"time"
)

func vazifa(id int) {
	fmt.Printf("Gorutina %d boshladi\n", id)
	time.Sleep(time.Second)
	fmt.Printf("Gorutina %d tugadi\n", id)
}

func main() {
	go vazifa(1) // Gorutina yaratish
	go vazifa(2) // Boshqa gorutina yaratish

	time.Sleep(2 * time.Second) // Gorutinalar tugashini kutamiz
	fmt.Println("Asosiy gorutina tugadi")
}