Sobes.tech
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 resume a yield.
  • 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í yield a 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 prvom resume.
  • fiber.resume(*args): Obnoví Fiber. Argumenty, ktoré sa odovzdajú do resume, sa stávajú návratovou hodnotou Fiber.yield alebo argumentmi spúšťacieho bloku.
  • Fiber.yield(*args): Pozastavuje aktuálny Fiber a vracia riadenie kódu, ktorý ho spustil (resume). Argumenty, ktoré sa odovzdajú do yield, sa stávajú návratovou hodnotou resume.
  • 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.