Пожалуйста, объясните логику, стоящую за этим примером ruby fiber
-
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
написано ли это так, как есть?
Решение
- Волокно создается и запускается в EventMachine
- цель состоит в том, чтобы (а) получить страницу и (б) поработать над ней
- волокно должно быть приостановлено до тех пор, пока страница не будет извлечена, это роль
http_get
http = EventMachine::HttpRequest.new(url).get
ничего не запускает:EventMachine должна вернуть себе бразды правления, это рольFiber.yield
- Как только EventMachine выполнит задание по получению страницы, он запускает обратный вызов и возобновляет передачу, которая была остановлена на
puts ...
Яснее?
Не связан с StackOverflow