1

我有以下代码:

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

任何帮助将不胜感激。谢谢!

4

2 回答 2

1

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

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

于 2011-01-13T07:54:20.747 回答
0

Sinatra::Async 提供了它自己的body帮助程序,需要从 EventMachine 循环中调用。另外值得注意的是:如果您通过 Thin 运行 Sinatra,则不应EM.run显式调用,因为 Sinatra 已经在 EventMachine 循环中运行。

于 2011-01-31T17:25:34.403 回答