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ş,
resumeveyieldmetodları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 veresumeç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, ilkresumeç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.