我有以下代码:
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
任何帮助将不胜感激。谢谢!
答案 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循环中运行。