Fiber в Ruby — это легковесный поток выполнения (coroutine), который позволяет создавать несколько параллельных потоков выполнения внутри одного процесса / треда операционной системы. Это позволяет управлять порядком выполнения кода, переключаясь между Fiber'ами без вовлечения планировщика ОС.
Основные характеристики Fiber:
Cooperative Scheduling: Fiber'ы не вытесняются ядром ОС. Переключение между ними происходит явным образом с помощью методов resume и yield.
Single Thread: Все Fiber'ы в одном треде выполняются последовательно, но переключение между ними создает иллюзию параллельности для кода внутри треда.
State Preservation: Fiber запоминает свое состояние (локальные переменные, точку выполнения) при вызове yield и возобновляет его при вызове resume.
Применение Fiber:
Реализация асинхронного кода: Моделирование неблокирующих операций без использования callback'ов или сложных конструкций.
Итераторы и генераторы: Создание сложных итераторов, которые генерируют значения по требованию.
Обработка конечных автоматов: Моделирование состояний и переходов в явном виде.
Пример использования:
Основные методы:
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, требуя явного управления переключениями.