Возобновление волокна по асинхронному методу
Я не могу понять, почему этот код не работает. Я пытаюсь эмулировать поведение синхронного кода, используя волокно.
require 'fiber'
require 'eventmachine'
def async_request(url)
f = Fiber.current
Thread.new do
sleep 0.3
puts 'Resuming Fiber'
f.resume('page fetched #{url}')
end
end
def async_get(url)
async_request url
val = Fiber.yield
return val
end
EM.run do
Fiber.new do
puts 'Fiber Started'
page = async_get('http://www.whatever.com')
puts page
end.resume
end
Когда я запускаю этот код, вывод:
$ ruby fiber_poc.rb
Fiber Started
Resuming Fiber
Волокно никогда не возобновляется. Не могли бы вы объяснить, как я могу это сделать?
Спасибо, парни
1 ответ
Решение
require 'fiber'
require 'eventmachine'
def async_request(url)
f = Fiber.current
EM.add_timer(0.3) do
puts 'Resuming Fiber'
f.resume("page fetched #{url}")
end
end
def async_get(url)
async_request url
Fiber.yield
end
EM.run do
Fiber.new do
puts 'Fiber Started'
page = async_get('http://www.whatever.com')
puts page
EM.stop
end.resume
end
ты получишь
#=> Fiber Started
#=> Resuming Fiber
#=> page fetched http://www.whatever.com