Как использовать волокна с ruby ​​eventmachine в non-rack?

Итак, в основном моя цель - получить какой-то легкий демон ruby ​​(или sidekiq/resque worker), который обрабатывает задания и уведомляет другие приложения через http. Само приложение не нуждается в получении http-запросов, поэтому ни одна стойка не останется настолько легкой, насколько это возможно. Немного рубинового кода, который я могу запустить в цикле {}

Поэтому стараемся не использовать схему реактора EventMachine'и вместо этого использовать оптоволоконный подход. Куда бы я поместил EM.run или EM.stop в этом контексте? Thread.new { EM.run }, похоже, не поддерживает оптоволокно, поэтому добавление не дало никаких обратных вызовов? Есть ли у них синхронная альтернатива?

#slow=true injects a sleep 3, so page 2 callback should output faster
require 'em-http-request'
require 'fiber'
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

puts "fetching some data from database for request params"
EventMachine.run do
  Fiber.new{
    page = http_get('http://localhost:3000/status?slow=true')
    puts "notified external page it responded with: #{page.response_header.status}"
  }.resume
  Fiber.new{
    page = http_get('http://localhost:4000/status')
    puts "notified external page 2 it responded with: #{page.response_header.status}"
  }.resume
  puts "Finishised notification task"
end
puts "Moving on to next task as fast as possible"

1 ответ

Избегайте изобретать колесо, используйте EM::Synchrony или, что еще лучше, переключитесь на целлулоид или целлулоид-ио, так как EM, кажется, вышел из строя

Другие вопросы по тегам