Sobes.tech
Middle+

Ruby'de Fiber nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Ruby'de Fiber, işletim sistemi işlemi/iş parçacığı içinde birkaç paralel yürütme akışı oluşturmayı sağlayan hafif bir yürütme akışıdır (koreografi). Bu, kodun yürütülme sırasını yönetmeye olanak tanır ve işletim sistemi planlayıcısını devreye sokmadan Fiber'lar arasında geçiş yapmayı sağlar.

Fiber'ın temel özellikleri:

  • Kooperatif Zamanlama: Fiber'lar işletim sistemi çekirdeği tarafından zorunlu olarak kesilmez. Aralarındaki geçiş, resume ve yield metodlarıyla açıkça yapılır.
  • Tek İş Parçacığı: Aynı iş parçacığındaki tüm Fiber'lar sıralı olarak çalışır, ancak aralarındaki geçiş, iş parçacığı içindeki kod için paralellik yanılsaması yaratır.
  • Durum Koruma: Fiber, yield çağrısı sırasında durumunu (yerel değişkenler, yürütme noktası) hatırlar ve resume çağrısı ile devam eder.

Fiber'ın kullanımları:

  • Asenkron kod uygulaması: Geri çağrılar veya karmaşık yapılar kullanmadan engellemeyen işlemler modelleme.
  • İteratörler ve üreticiler: Talep üzerine değerler üreten karmaşık iteratörler oluşturma.
  • Sonlu otomata işleme: Durumları ve geçişleri açıkça modelleme.

Kullanım örneği:

# Fiber oluşturma
fiber = Fiber.new do
  puts "Fiber 1'den Merhaba"
  value1 = Fiber.yield(1) # Yürütmeyi duraklatır, 1 döner
  puts "Fiber 1'den Alınan: #{value1}"

  puts "Fiber 2'den Merhaba"
  value2 = Fiber.yield(2) # Yürütmeyi duraklatır, 2 döner
  puts "Fiber 2'den Alınan: #{value2}"

  puts "Fiber 3'den Merhaba"
  3 # Fiber'ı tamamlar, 3 döner
end

puts "Ana: İlk resume'den önce"
result1 = fiber.resume # Fiber'ı yeniden başlat
puts "Ana: Fiber'dan alınan: #{result1}"

puts "Ana: İkinci resume'den önce"
result2 = fiber.resume("Main 1'den") # Yeniden başlat ve değer gönder
puts "Ana: Fiber'dan alınan: #{result2}"

puts "Ana: Üçüncü resume'den önce"
result3 = fiber.resume("Main 2'den") # Yeniden başlat ve değer gönder
puts "Ana: Fiber'dan alınan: #{result3}"

Ana metodlar:

  • Fiber.new { ... }: Yeni bir Fiber oluşturur. Kod bloğu, ilk resume çağrısında çalıştırılır.
  • fiber.resume(*args): Fiber'ı yeniden başlatır. resume'a geçirilen argümanlar, Fiber.yield'in dönüş değeri veya başlatan bloğun argümanları olur.
  • Fiber.yield(*args): Mevcut Fiber'ı duraklatır ve kontrolü başlatan koda geri verir (resume). yield'a geçirilen argümanlar, resume'in dönüş değeri olur.
  • Fiber.current: Mevcut Fiber'ı döndürür.

Fiber ile Thread arasındaki farklar:

Özellik Fiber Thread
Planlama Kooperatif (açıkça geçiş) Preemptif (işletim sistemi tarafından)
Kaynaklar Hafif (daha az kaynak) Daha ağır (daha fazla kaynak)
Paralellik Tek bir iş parçacığında sahte paralellik Gerçek paralellik (CPU çekirdekleri kullanır)
İletişim yield ve resume aracılığıyla Paylaşılan bellek, mesajlar vb. aracılığıyla
Hata ayıklama Göreceli olarak daha basit (düzenli akış) Daha karmaşık (yarış koşulları, kilitler)

Fiber'lar, Thread'e kıyasla daha düşük seviyeli yürütme kontrol mekanizması sağlar, ancak açıkça yönetim gerektirir.