async_sinatraでEM.deferを使うと止まる


このエントリーをはてなブックマークに追加

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 に上げたところこの問題は解決しました。