2012-01-26 9 views
2

私は最近、レール3にアップグレードする際に雑種から薄型に切り替えました。切り替えの前に、問題なくEventMachineを使用していました。 thinに切り替えると、EventMachineが呼び出されるたびにサーバーがボブし、返す変数がnilであると言います。EventMachineを薄く使っています

私が薄いと思うのは、おそらくMongrelで使用されていた実装と競合するEventMachineを利用しているからです。私はEventMachineではあまり働いていませんが、EventMachineを別のインスタンスの中で実行してEventMachineをThinによって使用されているものから分離する必要があるようです。正しい軌道にいるのですか? ThinのEventMachineとは別に独自のプロセスで実行するにはどうしたらいいですか?あなたが別々に1を設定する必要はありませんので、ここで

は、我々が現在

def connect 
    EventMachine.run { 
    args, options = { 
    :query => @options[:query], 
     :head => @options[:headers] 
    }, { 
     :connect_timeout => @options[:timeout], 
     :inactivity_timeout => @options[:timeout] 
    } 

    args[:body] = @options[:data] if allow_body? 
    args[:redirects] = @options[:redirects] if @options[:redirects] 

    http = EventMachine::HttpRequest.new(@uri, options).send(@options[:method], args) 

    http.errback { 
     @response = HttpConnection::Response.new(http, false, @options[:logger]) 

     EventMachine.stop 
    } 

    http.callback { 
     @response = HttpConnection::Response.new(http, true, @options[:logger]) 

     EventMachine.stop 
    } 
    } 

    return @response 
end 

答えて

3

を実施しているEventMachineの抜粋であるシンはすでに、EventMachineリアクターを提供し、管理します。私は初心者のためにこのコードをEventMachine.run {}ブロックに埋め込む必要はないと思います。

あなたのアプローチにはいくつか問題があります。まず、返された@response変数は、EventMachine::HttpRequestが非同期的に発生し、http.callback {}ブロックにヒットするまでデータを提供しないため、常にゼロになります。次に、EventMachine::HttpRequestコールバックのそれぞれで、EventMachine.stopを呼び出しています。これにより、Webサーバーが停止するという効果があります。これはおそらく、サーバーの爆撃が発生している理由です。

この種のコードをレールアプリ内で実行しようとすると、呼び出しを非同期で処理する方法を見つける必要があるため、長時間実行されるプロセスを待っている間にアプリケーションがハングしないようにする必要があります。起こる。私がこれに使用した良いアプローチは、asyncプラグインを持つSinatraを使用して、長時間実行しているリクエストを開くことができるようにすることです。これをrails3アプリにrails metalを使って含めることができます。これにより、非同期/イベントマシンコードへのリクエストがsinatraに送られます。

+0

あなたはすでに、シンナーがEMリアクターを提供していると思います。そして、EM.stopが薄くなって停止することは間違いありません!私はこのEMの実装を完全に打ち切ることにしました。私はSinatraと非同期プラグインを使って見ていきます。ありがとうダン –

関連する問題