← Каталог
Асинхронность в Ruby — Что такое `Fiber` и чем он отличается от `Thread`
Фрагмент из «Асинхронность в Ruby»: Что такое `Fiber` и чем он отличается от `Thread`.
Разбор:
- Фрагмент показывает конкретный сценарий, который стартует со строки `Разбор:` и задаёт контекст выполнения.
- Ключевые элементы блока: `Fiber`, `Async`, они определяют основную логику примера.
- По шагам код выполняется так: `Разбор:` -> `- Фрагмент показывает конкретный сценарий, который стартует со строк` -> `- Ключевые элементы блока: `Async`, они определяют основную логику п` -> `- По шагам код выполняется так: `require 'async'` -> `require 'async`.
- Для корректности важно поведение конкурентности: где блокировка, где ожидание, и как исключаются гонки между задачами.
- Типичная ошибка при развитии такого кода — смешивать бизнес-правила и инфраструктурные детали в одном месте; лучше разделять ответственность.
f = Fiber.new do
puts "1: начало"
x = Fiber.yield 100 # приостанавливает fiber, возвращает 100 вызвавшему
puts "3: возобновление с аргументом #{x}"
"результат"
end
puts "0: до resume"
v1 = f.resume # → "1: начало", затем возвращает 100
puts "2: после первого resume: #{v1}"
v2 = f.resume("арг") # → "3: возобновление...", затем возвращает "результат"
puts "4: итог: #{v2}"
Разбор:
- Фрагмент показывает конкретный сценарий, который стартует со строки `Разбор:` и задаёт контекст выполнения.
- Ключевые элементы блока: `Fiber`, `Async`, они определяют основную логику примера.
- По шагам код выполняется так: `Разбор:` -> `- Фрагмент показывает конкретный сценарий, который стартует со строк` -> `- Ключевые элементы блока: `Async`, они определяют основную логику п` -> `- По шагам код выполняется так: `require 'async'` -> `require 'async`.
- Для корректности важно поведение конкурентности: где блокировка, где ожидание, и как исключаются гонки между задачами.
- Типичная ошибка при развитии такого кода — смешивать бизнес-правила и инфраструктурные детали в одном месте; лучше разделять ответственность.
f = Fiber.new do
puts "1: начало"
x = Fiber.yield 100 # приостанавливает fiber, возвращает 100 вызвавшему
puts "3: возобновление с аргументом #{x}"
"результат"
end
puts "0: до resume"
v1 = f.resume # → "1: начало", затем возвращает 100
puts "2: после первого resume: #{v1}"
v2 = f.resume("арг") # → "3: возобновление...", затем возвращает "результат"
puts "4: итог: #{v2}"