Sobes.tech
Middle+

Šta je Fiber u Ruby-ju?

sobes.tech АИ

Одговор од АИ

Fiber u Ruby-ju je lagani tok izvršenja (korutina) koji omogućava kreiranje više paralelnih tokova izvršenja unutar jednog procesa / niti operativnog sistema. To omogućava upravljanje redosledom izvršavanja koda i prebacivanje između Fiber-a bez učešća planera OS-a.

Glavne karakteristike Fiber-a:

  • Kooperativno planiranje: Fiber-i se ne prekidaju od strane jezgra OS-a. Prebacivanje između njih je eksplicitno pomoću metoda resume i yield.
  • Jedno niti: Svi Fiber-i se izvršavaju sekvencijalno u jednoj niti, ali prebacivanje između njih stvara iluziju paralelnosti za kod unutar niti.
  • Čuvanje stanja: Fiber pamti svoje stanje (lokalne promenljive, tačku izvršenja) pri pozivu yield i vraća ga pri pozivu resume.

Primene Fiber-a:

  • Implementacija asinhronog koda: Modelovanje neblokirajućih operacija bez korišćenja callback-ova ili složenih struktura.
  • Iteratori i generatori: Kreiranje složenih iteratora koji generišu vrednosti na zahtev.
  • Obrada konačnih automata: Modelovanje stanja i prelaza eksplicitno.

Primer upotrebe:

# Kreiranje Fiber-a
fiber = Fiber.new do
  puts "Zdravo iz Fiber 1"
  value1 = Fiber.yield(1) # Zaustavljanje izvršenja, povratak 1
  puts "Primljeno iz Fiber 1: #{value1}"

  puts "Zdravo iz Fiber 2"
  value2 = Fiber.yield(2) # Zaustavljanje izvršenja, povratak 2
  puts "Primljeno iz Fiber 2: #{value2}"

  puts "Zdravo iz Fiber 3"
  3 # Završetak Fiber-a, povratak 3
end

puts "Glavni: Pre prvog resume"
result1 = fiber.resume # Obnavljanje Fiber-a
puts "Glavni: Primljeno iz Fiber-a: #{result1}"

puts "Glavni: Pre drugog resume"
result2 = fiber.resume("iz Glavnog 1") # Obnavljanje i prenos vrednosti
puts "Glavni: Primljeno iz Fiber-a: #{result2}"

puts "Glavni: Pre trećeg resume"
result3 = fiber.resume("iz Glavnog 2") # Obnavljanje i prenos vrednosti
puts "Glavni: Primljeno iz Fiber-a: #{result3}"

Osnovne metode:

  • Fiber.new { ... }: Kreira novi Fiber. Blok se izvršava pri prvom resume.
  • fiber.resume(*args): Obnavlja Fiber. Argumenti prosleđeni u resume postaju vrednost vraćena iz Fiber.yield ili argumenti početnog bloka.
  • Fiber.yield(*args): Zaustavlja trenutni Fiber i vraća kontrolu kodu koji ga je pokrenuo (resume). Argumenti prosleđeni u yield postaju vrednost vraćena iz resume.
  • Fiber.current: Vraća trenutni Fiber.

Razlika između Fiber i Thread:

Osobina Fiber Thread
Planiranje Kooperativno (izričito prebacivanje) Preemptivno (prethodno, od OS-a upravljano)
Resursi Lagan (manje resursa) Težak (više resursa)
Pararelizam Lažni paralelizam u okviru jednog niti Pravi paralelizam (koristi CPU jezgra)
Komunikacija Kroz yield i resume Kroz zajedničku memoriju, message passing itd.
Debugging Relativno jednostavnije (linearni tok) Teže (trke podataka, zaključavanja)

Fiber-i pružaju niži nivo upravljanja izvršenjem u poređenju sa Thread-om, zahtevajući eksplicitno upravljanje prebacivanjima.