Sobes.tech
Middle+

¿Qué es Fiber en Ruby?

sobes.tech AI

Respuesta de la IA

Fiber en Ruby es un hilo de ejecución ligero (coroutine) que permite crear múltiples hilos de ejecución paralelos dentro de un solo proceso/hilo del sistema operativo. Esto permite gestionar el orden de ejecución del código, alternando entre Fiber sin involucrar al planificador del sistema operativo.

Características principales de Fiber:

  • Programación cooperativa: Los Fiber no son preemptados por el núcleo del sistema operativo. La conmutación entre ellos se realiza explícitamente mediante los métodos resume y yield.
  • Hilo único: Todos los Fiber en un mismo hilo se ejecutan secuencialmente, pero la conmutación entre ellos crea una ilusión de paralelismo para el código dentro del hilo.
  • Preservación de estado: Fiber recuerda su estado (variables locales, punto de ejecución) al llamar a yield y lo reanuda al llamar a resume.

Aplicaciones de Fiber:

  • Implementación de código asíncrono: Modelar operaciones no bloqueantes sin usar callbacks o construcciones complejas.
  • Iteradores y generadores: Crear iteradores complejos que generan valores bajo demanda.
  • Manejo de autómatas finitos: Modelar estados y transiciones de forma explícita.

Ejemplo de uso:

# Crear un Fiber
fiber = Fiber.new do
  puts "Hola desde Fiber 1"
  value1 = Fiber.yield(1) # Pausa la ejecución, devuelve 1
  puts "Recibido Fiber 1: #{value1}"

  puts "Hola desde Fiber 2"
  value2 = Fiber.yield(2) # Pausa la ejecución, devuelve 2
  puts "Recibido Fiber 2: #{value2}"

  puts "Hola desde Fiber 3"
  3 # Finaliza el Fiber, devuelve 3
end

puts "Main: Antes del primer resume"
result1 = fiber.resume # Reanuda la ejecución del Fiber
puts "Main: Recibido del Fiber: #{result1}"

puts "Main: Antes del segundo resume"
result2 = fiber.resume("desde Main 1") # Reanuda y pasa valor
puts "Main: Recibido del Fiber: #{result2}"

puts "Main: Antes del tercer resume"
result3 = fiber.resume("desde Main 2") # Reanuda y pasa valor
puts "Main: Recibido del Fiber: #{result3}"

Métodos principales:

  • Fiber.new { ... }: Crea un nuevo Fiber. El bloque de código se ejecuta en la primera llamada a resume.
  • fiber.resume(*args): Reanuda la ejecución del Fiber. Los argumentos pasados a resume se convierten en el valor devuelto por Fiber.yield o en los argumentos del bloque que lo inició.
  • Fiber.yield(*args): Pausa la ejecución del Fiber actual y devuelve el control al código que lo inició (resume). Los argumentos pasados a yield se convierten en el valor devuelto por resume.
  • Fiber.current: Devuelve el Fiber actual.

Diferencias entre Fiber y Thread:

Característica Fiber Thread
Planificación Cooperativa (conmutación explícita) Preemptiva (por el sistema operativo)
Recursos Livianos (menos recursos) Más pesados (más recursos)
Paralelismo Falso paralelismo en un solo hilo Paralelismo real (usa núcleos CPU)
Comunicación A través de yield y resume A través de memoria compartida, mensajes, etc.
Depuración Relativamente simple (flujo lineal) Más compleja (condiciones de carrera, bloqueos)

Los Fiber proporcionan un mecanismo de control de ejecución de nivel inferior en comparación con los Thread, requiriendo una gestión explícita de los cambios de contexto.