Запросы async_sinatra молча завершаются с em-http.Как это исправить? - PullRequest
1 голос
/ 13 января 2011

У меня есть следующий код:

require 'rubygems'
require 'eventmachine'
require 'em-http'
require 'sinatra/base'
require 'sinatra/async'

class Api < Sinatra::Base
  register Sinatra::Async

  aget '/1' do
      EventMachine.run {
         http = EventMachine::HttpRequest.new( "http://www.google.com").get(:timeout => 5)
         http.callback { puts "h2" ;ret_val = http.response; EventMachine.stop}
         http.errback {puts "was h2ere1" ;ret_val = nil; EventMachine.stop}
       }
       body "done processing 1"
  end

  aget '/2' do
       body "done processing 2"
  end

end

Когда я выдаю следующее, оно работает хорошо:

 curl http://localhost:3000/2

Но, когда я запускаю следующий запрос, он печатает «h2» и приложение молча завершает работу:

 curl http://localhost:3000/1

Любая помощь будет оценена. Спасибо!

Ответы [ 2 ]

1 голос
/ 13 января 2011

Если ваш веб-сервер (например, тонкий) основан на EventMachine, строка EventMachine.stop фактически остановит веб-сервер, а также экземпляр EventMachine, созданный EventMachine.run.найти способ остановить вложенные EventMachines, как это.Мой совет - используйте Weary или другую неблокирующую библиотеку HTTP-запросов.

0 голосов
/ 31 января 2011

Sinatra :: Async предоставляет свой собственный помощник body, который должен вызываться из цикла EventMachine. Также стоит отметить: если вы запускаете Sinatra через Thin, вам не следует явно вызывать EM.run, поскольку Sinatra уже работает внутри цикла EventMachine.

...