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 インスタンスを実際に停止します。

このようにネストされた EventMachine を停止する方法が見つかりません。私のアドバイス - Wearyまたは別のノンブロッキング HTTP リクエスト ライブラリを使用してください。

于 2011-01-13T07:54:20.747 に答える
0

Sinatra::Async はbody、EventMachine ループ内から呼び出す必要がある独自のヘルパーを提供します。また、注目に値する: Sinatra を Thin で実行している場合EM.run、Sinatra は既に EventMachine ループ内で動作しているため、明示的に呼び出すべきではありません。

于 2011-01-31T17:25:34.403 に答える