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
resumeyyield. - 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
yieldy lo reanuda al llamar aresume.
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 aresume.fiber.resume(*args): Reanuda la ejecución del Fiber. Los argumentos pasados aresumese convierten en el valor devuelto porFiber.yieldo 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 ayieldse convierten en el valor devuelto porresume.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.