Middle+
Čo je Fiber v Ruby?
sobes.tech AI
Odpoveď od AI
Fiber v Ruby je ľahký behový vlákno (korutina), ktorý umožňuje vytváranie viacerých paralelných behových vlákien v rámci jedného procesu / vlákna operačného systému. To umožňuje riadiť poradie vykonávania kódu a prepínanie medzi Fiber bez zásahu plánovača OS.
Hlavné vlastnosti Fiber:
- Kooperatívne plánovanie: Fiber-ky nie sú predčasne prerušené jadrom OS. Prechod medzi nimi je explicitný pomocou metód
resumeayield. - Jednovláknové: Všetky Fiber sa vykonávajú sekvenčne v jednom vlákne, ale prechod medzi nimi vytvára ilúziu paralelnosti pre kód vo vnútri vlákna.
- Uchovávanie stavu: Fiber si pamätá svoj stav (lokálne premenné, bod vykonávania) pri volaní
yielda obnovuje ho pri volaníresume.
Použitie Fiber:
- Implementácia asynchrónneho kódu: Modelovanie neblokujúcich operácií bez použitia callback-ov alebo zložitých štruktúr.
- Iterátory a generátory: Vytváranie zložitých iterátorov, ktoré generujú hodnoty na požiadanie.
- Spracovanie konečných automatov: Modelovanie stavov a prechodov explicitne.
Príklad použitia:
# Vytvorenie Fiber
fiber = Fiber.new do
puts "Ahoj z Fiber 1"
value1 = Fiber.yield(1) # Pozastavenie vykonávania, návrat 1
puts "Prijaté z Fiber 1: #{value1}"
puts "Ahoj z Fiber 2"
value2 = Fiber.yield(2) # Pozastavenie vykonávania, návrat 2
puts "Prijaté z Fiber 2: #{value2}"
puts "Ahoj z Fiber 3"
3 # Dokončenie Fiber, návrat 3
end
puts "Hlavný: Pred prvým resume"
result1 = fiber.resume # Obnovenie Fiber
puts "Hlavný: Z Fiberu získané: #{result1}"
puts "Hlavný: Pred druhým resume"
result2 = fiber.resume("z Hlavného 1") # Obnovenie a prenos hodnoty
puts "Hlavný: Z Fiberu získané: #{result2}"
puts "Hlavný: Pred tretím resume"
result3 = fiber.resume("z Hlavného 2") # Obnovenie a prenos hodnoty
puts "Hlavný: Z Fiberu získané: #{result3}"
Hlavné metódy:
Fiber.new { ... }: Vytvorí nový Fiber. Blok sa vykonáva pri prvomresume.fiber.resume(*args): Obnoví Fiber. Argumenty, ktoré sa odovzdajú doresume, sa stávajú návratovou hodnotouFiber.yieldalebo argumentmi spúšťacieho bloku.Fiber.yield(*args): Pozastavuje aktuálny Fiber a vracia riadenie kódu, ktorý ho spustil (resume). Argumenty, ktoré sa odovzdajú doyield, sa stávajú návratovou hodnotouresume.Fiber.current: Vráti aktuálny Fiber.
Rozdiel medzi Fiber a Thread:
| Vlastnosť | Fiber | Thread |
|---|---|---|
| Plánovanie | Kooperatívne (explicitné prepínanie) | Preemptívne (predbežné, OS riadené) |
| Zdroje | Ľahké (menej zdrojov) | Ťažšie (viac zdrojov) |
| Paralelizmus | Falošný paralelizmus v rámci jedného vlákna | Skutočný paralelizmus (využíva CPU jadrá) |
| Komunikácia | Prostredníctvom yield a resume |
Prostredníctvom zdieľanej pamäte, message passing atď. |
| Debugging | Relatívne jednoduchšie (lineárny tok) | Zložitejšie (závody dát, zámky) |
Fiber poskytujú nižšiu úroveň riadenia vykonávania v porovnaní s Thread, vyžadujú explicitné riadenie prechodov.