Пожалуйста, объясните логику, стоящую за этим примером ruby fiber

StackOverflow https://stackoverflow.com//questions/12662556

  •  11-12-2019
  •  | 
  •  

Вопрос

Пример кода взят из здесь:

def http_get(url)
  f = Fiber.current
  http = EventMachine::HttpRequest.new(url).get

  # resume fiber once http call is done
  http.callback { f.resume(http) }
  http.errback  { f.resume(http) }

  return Fiber.yield
end

EventMachine.run do
  Fiber.new{
    page = http_get('http://www.google.com/')
    puts "Fetched page: #{page.response_header.status}"

    if page
      page = http_get('http://www.google.com/search?q=eventmachine')
      puts "Fetched page 2: #{page.response_header.status}"
    end
  }.resume
end

Итак, в контексте блока EM run автор создает fiber и немедленно запускает его с помощью resume.Но я не понимаю, почему http_get логика структурирована именно таким образом.Я имею в виду, что он использует текущее волокно (которое в данном случае должно быть создано в блоке EM run), запускает http-запрос, который может завершиться неудачей или успешно завершиться успехом, и возобновляет текущее волокно.После этого он просто звонит yield на волокне.Что именно будет запущено, поскольку он вызывает yield?Кто-нибудь, пожалуйста, может объяснить, почему http_get написано ли это так, как есть?

Это было полезно?

Решение

  1. Волокно создается и запускается в EventMachine
  2. цель состоит в том, чтобы (а) получить страницу и (б) поработать над ней
  3. волокно должно быть приостановлено до тех пор, пока страница не будет извлечена, это роль http_get
  4. http = EventMachine::HttpRequest.new(url).get ничего не запускает:EventMachine должна вернуть себе бразды правления, это роль Fiber.yield
  5. Как только EventMachine выполнит задание по получению страницы, он запускает обратный вызов и возобновляет передачу, которая была остановлена на puts ...

Яснее?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top