Sobes.tech
Junior

Goroutine'ler ile thread'ler (iş parçacıkları) arasındaki fark nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Gorutinler, aşağıdaki temel yönlerden farklılık gösterir:

  • Yönetim: Gorutinler, Go çalışma zamanı ortamı tarafından yönetilirken, threadler (iş parçacıkları) işletim sistemi tarafından yönetilir. Bu, gorutinler arasında geçiş yapmayı çok daha hafif ve hızlı hale getirir, çünkü çekirdek bağlamı değiştirmeye gerek yoktur.
  • Maliyetler: Gorutinlerin oluşturulması ve yönetimi, threadlere kıyasla çok daha az kaynak (bellek ve zaman) gerektirir. Bir gorutin, çok küçük bir yığınla (birkaç kilobyte) başlar ve ihtiyaç duyuldukça dinamik olarak büyüyebilir veya küçülebilir, oysa threadler sabit, genellikle çok daha büyük yığınlara sahiptir.
  • Ölçeklenebilirlik: Düşük maliyetleri sayesinde, bir uygulamada yüzbinlerce veya hatta milyonlarca goroutine kolayca oluşturulabilir, oysa aynı sayıda thread oluşturmak sistem kaynaklarını hızla tüketir.
  • Planlama: Go'nun planlayıcısı, çok sayıda goroutine'u daha az sayıda işletim sistemi thread'ine çoklayarak yönetir. Bu, goroutine'ler arasında kooperatif çoklu görev yürütmeyi (bir thread üzerinde, preemption unsurlarıyla birlikte) gerçekleştirirken, işletim sistemi thread'leri, işletim sistemi planlayıcısı tarafından yönetilir ve zorlayıcı çoklu görev kullanır.
Yön Goroutines Threadler (İş Parçacıkları)
Yönetim Go çalışma zamanı ortamı İşletim sistemi
Maliyetler Düşük (bellek, zaman) Yüksek (bellek, zaman)
Ölçeklenebilirlik Çok yüksek Sistem kaynaklarıyla sınırlı
Planlama Go planlayıcısı (işbirlikçi) İşletim sistemi planlayıcısı (zorlayıcı)
Yığın Dinamik, küçük Sabit, genellikle büyük

Goroutine oluşturma örneği:

package main

import (
	"fmt"
	"time"
)

func görev(id int) {
	fmt.Printf("Goroutine %d başladı\n", id)
	time.Sleep(time.Second)
	fmt.Printf("Goroutine %d sona erdi\n", id)
}

func main() {
	go görev(1) // Goroutine oluşturma
	go görev(2) // Başka bir goroutine oluşturma

	time.Sleep(2 * time.Second) // Goroutine'lerin bitmesini bekle
	fmt.Println("Ana goroutine sona erdi")
}