Код IT
← Каталог

Асинхронность в Ruby — `Fiber.scheduler`

Фрагмент из «Асинхронность в Ruby»: `Fiber.scheduler`.

Ruby main.rb

Разбор:
- Фрагмент показывает конкретный сценарий, который стартует со строки `После этого *определённые системные вызовы*, выполняемые внутри `Fiber`, перехватываются и` и задаёт контекст выполнения.
- Ключевые элементы блока: `join`, `Fiber`, `wait`, они определяют основную логику примера.
- По шагам код выполняется так: `После этого *определённые системные вызовы*, выполняемые внутри `Fib` -> `- `Kernel#sleep`` -> `- `IO#wait_readable`, `IO#wait_writable`, `IO#wait`` -> `- `IO#read`, `IO#write`, `IO#readpartial`, `IO#sysread`, `IO#syswrit`.
- Для корректности важно поведение конкурентности: где блокировка, где ожидание, и как исключаются гонки между задачами.
- Типичная ошибка при развитии такого кода — смешивать бизнес-правила и инфраструктурные детали в одном месте; лучше разделять ответственность.

Fiber.set_scheduler(Async::Scheduler.new)

Fiber.schedule do
  io = TCPSocket.new("example.com", 80)
  io.write "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"
  response = io.read
  puts response
end

Разбор:
- Фрагмент показывает конкретный сценарий, который стартует со строки `После этого *определённые системные вызовы*, выполняемые внутри `Fiber`, перехватываются и` и задаёт контекст выполнения.
- Ключевые элементы блока: `join`, `Fiber`, `wait`, они определяют основную логику примера.
- По шагам код выполняется так: `После этого *определённые системные вызовы*, выполняемые внутри `Fib` -> `- `Kernel#sleep`` -> `- `IO#wait_readable`, `IO#wait_writable`, `IO#wait`` -> `- `IO#read`, `IO#write`, `IO#readpartial`, `IO#sysread`, `IO#syswrit`.
- Для корректности важно поведение конкурентности: где блокировка, где ожидание, и как исключаются гонки между задачами.
- Типичная ошибка при развитии такого кода — смешивать бизнес-правила и инфраструктурные детали в одном месте; лучше разделять ответственность.

Fiber.set_scheduler(Async::Scheduler.new)

Fiber.schedule do
  io = TCPSocket.new("example.com", 80)
  io.write "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"
  response = io.read
  puts response
end