async_sinatraの
aget
をつかったルーティングの中で
EM.defer
を使うとcallbackされない、もしくはcallbackされたとしてもものすごい時間がかかってしまうという問題があるようです。
aget "/" do
process = proc do
sleep 1
end
callback = proc do
body "complete"
end
EM.defer process, callback
end
上記のようなコードでhttpリクエストをなげると何時までたってもレスポンスが帰って来ません。
async_sinatraでは内部で
EM.add_timer
等を使っています。その中で
EM.defer
を使うと上記の問題が発生するのでないかと思います。
なお、上記の問題はMac OS X Lionでは大丈夫で、CentOS 6.2 だとダメでした。
追記
この問題はthinを使用している時にEM.deferのコールバックが呼び出されないことが原因のようです。async_sinatraを使わない場合にも同様の問題が生じていました。
解決策
rubyのバージョンを 1.9.2から1.9.3 に上げたところこの問題は解決しました。