Sobes.tech
Middle+

Co je Fiber v Ruby?

sobes.tech AI

Odpověď od AI

Fiber v Ruby je lehký běhový vlákno (korutina), které umožňuje vytvářet několik paralelních běhových vláken uvnitř jednoho procesu / vlákna operačního systému. To umožňuje řídit pořadí provádění kódu a přepínat mezi Fiber bez zásahu plánovače OS.

Hlavní vlastnosti Fiber:

  • Kooperativní plánování: Fiber nejsou předčasně přerušována jádrem OS. Přepínání mezi nimi je explicitní pomocí metod resume a yield.
  • Jednovláknové: Všechna Fiber se provádějí sekvenčně v jednom vlákně, ale přepínání mezi nimi vytváří iluzi paralelnosti pro kód uvnitř vlákna.
  • Uchovávání stavu: Fiber si pamatuje svůj stav (lokální proměnné, bod provádění) při volání yield a obnovuje jej při volání resume.

Použití Fiber:

  • Implementace asynchronního kódu: Modelování neblokujících operací bez použití callbacků nebo složitých konstrukcí.
  • Iterátory a generátory: Vytváření složitých iterátorů, které generují hodnoty na požádání.
  • Zpracování konečných automatů: Modelování stavů a přechodů explicitně.

Příklad použití:

# Vytvoření Fiber
fiber = Fiber.new do
  puts "Ahoj z Fiber 1"
  value1 = Fiber.yield(1) # Pozastavení provádění, návrat 1
  puts "Získáno z Fiber 1: #{value1}"

  puts "Ahoj z Fiber 2"
  value2 = Fiber.yield(2) # Pozastavení provádění, návrat 2
  puts "Získáno z Fiber 2: #{value2}"

  puts "Ahoj z Fiber 3"
  3 # Dokončení Fiber, návrat 3
end

puts "Hlavní: Před prvním resume"
result1 = fiber.resume # Obnovení Fiber
puts "Hlavní: Z Fiberu získáno: #{result1}"

puts "Hlavní: Před druhým resume"
result2 = fiber.resume("z Hlavního 1") # Obnovení a předání hodnoty
puts "Hlavní: Z Fiberu získáno: #{result2}"

puts "Hlavní: Před třetím resume"
result3 = fiber.resume("z Hlavního 2") # Obnovení a předání hodnoty
puts "Hlavní: Z Fiberu získáno: #{result3}"

Hlavní metody:

  • Fiber.new { ... }: Vytvoří nový Fiber. Blok se provádí při prvním volání resume.
  • fiber.resume(*args): Obnoví Fiber. Argumenty předané do resume se stávají návratovou hodnotou Fiber.yield nebo argumenty spouštěcího bloku.
  • Fiber.yield(*args): Pozastavuje aktuální Fiber a vrací řízení kódu, který jej spustil (resume). Argumenty předané do yield se stávají návratovou hodnotou resume.
  • Fiber.current: Vrací aktuální Fiber.

Rozdíl mezi Fiber a Thread:

Vlastnost Fiber Thread
Plánování Kooperativní (explicitní přepínání) Preemptivní (předčasné, řízené OS)
Zdroje Lehký (méně zdrojů) Těžší (více zdrojů)
Paralelismus Falešný paralelismus v rámci jednoho vlákna Skutečný paralelismus (využívá CPU jádra)
Komunikace Přes yield a resume Přes sdílenou paměť, message passing apod.
Debugování Relativně jednodušší (lineární tok) Složitější (závody dat, zámky)

Fiber poskytují nižší úroveň řízení provádění ve srovnání s Thread, vyžadují explicitní řízení přepínání.