async_sinatra请求使用em-http静默崩溃。我该如何解决?

时间:2011-01-13 07:29:45

标签: sinatra eventmachine

我有以下代码:

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 个答案:

答案 0 :(得分:1)

如果您的Web服务器(例如,瘦)基于EventMachine,则EventMachine.stop行将实际停止Web服务器以及EventMachine.run创建的EventMachine实例。

我找不到像这样停止嵌套的EventMachines的方法。我的建议 - 使用Weary或其他非阻塞HTTP请求库。

答案 1 :(得分:0)

Sinatra :: Async提供了自己的body助手,需要在EventMachine循环中调用。另外值得注意的是:如果你通过Thin运行Sinatra,你不应该明确地调用EM.run,因为Sinatra已经在EventMachine循环中运行。