Fiber в Ruby — это легковесный поток выполнения (coroutine), который позволяет создавать несколько параллельных потоков выполнения внутри одного процесса / треда операционной системы. Это позволяет управлять порядком выполнения кода, переключаясь между Fiber'ами без вовлечения планировщика ОС.
Основные характеристики Fiber:
resume и yield.yield и возобновляет его при вызове resume.Применение Fiber:
Пример использования:
ruby
Основные методы:
Fiber.new { ... }: Создает новый Fiber. Блок кода выполняется при первом вызове resume.fiber.resume(*args): Возобновляет выполнение Fiber. Аргументы, переданные в resume, становятся возвращаемым значением Fiber.yield или аргументами запускающего блока.Fiber.yield(*args): Приостанавливает выполнение текущего Fiber'а и возвращает управление коду, который его запустил (resume). Аргументы, переданные в yield, становятся возвращаемым значением resume.Fiber.current: Возвращает текущий Fiber.Разница между Fiber и Thread:
| Признак | Fiber | Thread |
|---|---|---|
| Планирование | Cooperative (явное переключение) | Preemptive (вытесняющее, ОС-управляемое) |
| Ресурсы | Легковесные (менее ресурсов) | Более тяжелые (больше ресурсов) |
| Параллелизм | Mock-параллелизм в рамках одного треда | Истинный параллелизм (использует ядра CPU) |
| Общение | Через yield и resume | Через общую память, message passing, и т.д. |
| Отладка | Относительно проще (линейный поток) | Сложнее (гонки данных, блокировки) |
Fiber'ы предоставляют более низкоуровневый механизм управления выполнением по сравнению с Thread, требуя явного управления переключениями.