Sobes.tech
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 resume en yield.
  • 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 yield en hervat deze bij resume.

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 van resume.
  • fiber.resume(*args): Hervat de uitvoering van de Fiber. De argumenten die aan resume worden doorgegeven, worden de terugkeerwaarde van Fiber.yield of 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 aan yield worden doorgegeven, worden de terugkeerwaarde van resume.
  • 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.