Middle+
Wat is Fiber in Ruby?
sobes.tech AI
Antwoord van AI
Fiber in Ruby is een lichtgewicht uitvoeringsstroom (coroutine) die het mogelijk maakt om meerdere parallelle uitvoeringsstromen binnen één proces / thread van het besturingssysteem te creëren. Dit stelt je in staat om de volgorde van code-uitvoering te beheren door tussen Fiber's te schakelen zonder de scheduler van het OS te betrekken.
Belangrijkste kenmerken van Fiber:
- Coöperatieve planning: Fiber's worden niet door de OS-kernel onderbroken. De overschakeling tussen hen gebeurt expliciet via de methoden
resumeenyield. - Enkelvoudige thread: Alle Fiber's binnen één thread worden sequentieel uitgevoerd, maar de overschakeling tussen hen creëert een illusie van parallelisme voor de code binnen de thread.
- Staatbehoud: Fiber onthoudt zijn toestand (lokale variabelen, uitvoeringspunt) bij het aanroepen van
yielden hervat deze bijresume.
Toepassingen van Fiber:
- Implementatie van asynchrone code: Modelleren van niet-blokkerende operaties zonder gebruik te maken van callbacks of complexe constructies.
- Iterators en generators: Creëren van complexe iterators die waarden op aanvraag genereren.
- Verwerking van eindige automaten: Modelleren van toestanden en overgangen expliciet.
Voorbeeld van gebruik:
# Fiber maken
fiber = Fiber.new do
puts "Hallo van Fiber 1"
value1 = Fiber.yield(1) # Pauzeert de uitvoering, geeft 1 terug
puts "Ontvangen van Fiber 1: #{value1}"
puts "Hallo van Fiber 2"
value2 = Fiber.yield(2) # Pauzeert de uitvoering, geeft 2 terug
puts "Ontvangen van Fiber 2: #{value2}"
puts "Hallo van Fiber 3"
3 # Beëindigt de Fiber, geeft 3 terug
end
puts "Main: Voor de eerste resume"
result1 = fiber.resume # Hervat de Fiber
puts "Main: Ontvangen van Fiber: #{result1}"
puts "Main: Voor de tweede resume"
result2 = fiber.resume("van Main 1") # Hervat en geef waarde door
puts "Main: Ontvangen van Fiber: #{result2}"
puts "Main: Voor de derde resume"
result3 = fiber.resume("van Main 2") # Hervat en geef waarde door
puts "Main: Ontvangen van Fiber: #{result3}"
Belangrijkste methoden:
Fiber.new { ... }: Maakt een nieuwe Fiber. De codeblok wordt uitgevoerd bij de eerste aanroep vanresume.fiber.resume(*args): Hervat de uitvoering van de Fiber. De argumenten die aanresumeworden doorgegeven, worden de terugkeerwaarde vanFiber.yieldof de argumenten van de startende blok.Fiber.yield(*args): Pauzeert de huidige Fiber en geeft de controle terug aan de code die deze heeft gestart (resume). De argumenten die aanyieldworden doorgegeven, worden de terugkeerwaarde vanresume.Fiber.current: Geeft de huidige Fiber terug.
Verschillen tussen Fiber en Thread:
| Kenmerk | Fiber | Thread |
|---|---|---|
| Planning | Coöperatief (expliciete overschakeling) | Preëmptief (door OS beheerd) |
| Resources | Lichtgewicht (minder resources) | Zwaarder (meer resources) |
| Parallelisme | Valse parallelisme binnen één thread | Echte parallelisme (maakt gebruik van CPU-kernen) |
| Communicatie | Via yield en resume |
Via gedeeld geheugen, berichten, etc. |
| Debugging | Relatief eenvoudiger (lineaire stroom) | Complexer (racecondities, blokkades) |
Fiber's bieden een lager niveau mechanisme voor uitvoeringbeheer in vergelijking met Thread, en vereisen expliciet beheer van contextwisselingen.