Sobes.tech
Middle+

Ce este Fiber în Ruby?

sobes.tech AI

Răspuns de la AI

Fiber în Ruby este un fir de execuție ușor (coroutine) care permite crearea mai multor fire de execuție paralele într-un singur proces / fir al sistemului de operare. Acest lucru permite gestionarea ordinii de execuție a codului, alternând între Fiber fără implicarea planificatorului OS.

Caracteristici principale ale Fiber:

  • Planificare cooperativă: Fiber-urile nu sunt preemptate de nucleul sistemului de operare. Comutarea între ele se face explicit prin metodele resume și yield.
  • Fir unic: Toate Fiber-urile din același fir sunt executate secvențial, dar comutarea între ele creează o iluzie de paralelism pentru codul din interiorul firului.
  • Păstrarea stării: Fiber își amintește starea (variabile locale, punctul de execuție) la apelarea yield și o reia la apelarea resume.

Aplicații ale Fiber:

  • Implementarea codului asincron: Modelarea operațiilor non-blocante fără callback-uri sau construcții complexe.
  • Iteratori și generatoare: Crearea de iteratori complecși care generează valori la cerere.
  • Prelucrarea automatelor finite: Modelarea explicită a stărilor și tranzițiilor.

Exemplu de utilizare:

# Crearea unui Fiber
fiber = Fiber.new do
  puts "Salut din Fiber 1"
  value1 = Fiber.yield(1) # Pauzează execuția, returnează 1
  puts "Primirea din Fiber 1: #{value1}"

  puts "Salut din Fiber 2"
  value2 = Fiber.yield(2) # Pauzează execuția, returnează 2
  puts "Primirea din Fiber 2: #{value2}"

  puts "Salut din Fiber 3"
  3 # Încheie Fiber-ul, returnează 3
end

puts "Main: Înainte de primul resume"
result1 = fiber.resume # Reia execuția Fiber
puts "Main: Primit din Fiber: #{result1}"

puts "Main: Înainte de al doilea resume"
result2 = fiber.resume("din Main 1") # Reia și transmite valoare
puts "Main: Primit din Fiber: #{result2}"

puts "Main: Înainte de al treilea resume"
result3 = fiber.resume("din Main 2") # Reia și transmite valoare
puts "Main: Primit din Fiber: #{result3}"

Metode principale:

  • Fiber.new { ... }: Creează un nou Fiber. Blocul de cod se execută la primul apel resume.
  • fiber.resume(*args): Reia execuția Fiber. Argumentele transmise la resume devin valoarea returnată de Fiber.yield sau argumentele blocului inițial.
  • Fiber.yield(*args): Oprește execuția Fiber curent și returnează controlul către codul care l-a inițiat (resume). Argumentele transmise la yield devin valoarea returnată de resume.
  • Fiber.current: Returnează Fiber-ul curent.

Diferențe între Fiber și Thread:

Caracteristică Fiber Thread
Planificare Cooperativă (schimb explicit) Preemptiv (gestionat de OS)
Resurse Ușor (mai puține resurse) Mai greu (mai multe resurse)
Paralelism Paralelism fals în același fir Paralelism adevărat (folosește nuclee CPU)
Comunicare Prin yield și resume Prin memorie partajată, mesaje etc.
Debugging Relativ mai simplu (flux liniar) Mai complex (condiții de cursă, blocări)

Fiber oferă un mecanism de control al execuției de nivel inferior comparativ cu Thread, necesitând gestionare explicită a schimbărilor de context.