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
resumeayield. - 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í
yielda 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é doresumese stávají návratovou hodnotouFiber.yieldnebo 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é doyieldse stávají návratovou hodnotouresume.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í.