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
resumeiyield. - 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
yieldi vraća ga pri pozivuresume.
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 prvomresume.fiber.resume(*args): Obnavlja Fiber. Argumenti prosleđeni uresumepostaju vrednost vraćena izFiber.yieldili argumenti početnog bloka.Fiber.yield(*args): Zaustavlja trenutni Fiber i vraća kontrolu kodu koji ga je pokrenuo (resume). Argumenti prosleđeni uyieldpostaju vrednost vraćena izresume.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.