Junior
Gorutinalar ilə iş parçaları (threadlər) arasındakı fərq nədir?
sobes.tech Süni İntellekt
AI-dan cavab
Gorutinalar aşağıdakı əsas aspektlərdə iplərdən (threadlər) fərqlənir:
- İdarəetmə: Gorutinalar Go icra mühiti tərəfindən idarə olunur, iplər isə əməliyyat sisteminin idarə edir. Bu, gorutinalar arasında keçidi çox daha yüngül və sürətli edir, çünki nüvə kontekstinin dəyişdirilməsi tələb olunmur.
- Xərclər: Gorutinaların yaradılması və idarə olunması ip ilə müqayisədə çox az resurs (yaddaş və vaxt) tələb edir. Gorutina çox kiçik yastıqla (bir neçə kilobayt) başlayır və ehtiyac olduqda dinamik olaraq böyüyə və ya kiçilə bilər, iplər isə sabit, çox vaxt daha böyük yastıqla işləyir.
- Miqyaslama: Aşağı xərclər sayəsində, bir tətbiqdə yüz minlərlə və ya hətta milyonlarla gorutina asanlıqla yaradıla bilər, eyni sayda ip yaratmaq isə sistem resurslarını tez tükədər.
- Planlaşdırma: Go planlayıcısı çox sayda gorutinaları daha az sayda əməliyyat sistemi ip-ə çoxlayır. Bu, gorutinalar arasında kooperativ çoxlu vəzifə yerinə yetirməyi (bir ipdə, preemption elementləri ilə birlikdə) həyata keçirir, əməliyyat sistemi ip-ləri isə əməliyyat sistemi planlayıcısı tərəfindən idarə olunur və preemptiv çoxlu vəzifə yerinə yetirməyi dəstəkləyir.
| Aspekt | Gorutinalar | İplər (Threadlər) |
|---|---|---|
| İdarəetmə | Go icra mühiti | Əməliyyat sistemi |
| Xərclər | Aşağı (yaddaş, vaxt) | Yüksək (yaddaş, vaxt) |
| Miqyaslama | Çox yüksək | Sistem resursları ilə məhdudlaşdırılmış |
| Planlaşdırma | Go planlayıcısı (kooperativ) | OS planlayıcısı (preemptiv) |
| Yastıq | Dinamik, kiçik | Sabit, çox vaxt böyük |
Gorutina yaratma nümunəsi:
package main
import (
"fmt"
"time"
)
func vəzifə(id int) {
fmt.Printf("Gorutina %d başladı\n", id)
time.Sleep(time.Second)
fmt.Printf("Gorutina %d bitdi\n", id)
}
func main() {
go vəzifə(1) // Gorutina yaradılması
go vəzifə(2) // Başqa gorutina yaradılması
time.Sleep(2 * time.Second) // Gorutinaların tamamlanmasını gözləyirik
fmt.Println("Əsas gorutina tamamlandı")
}