2012-03-16 4 views
0

私はmongoにファイルを保存するRailsアプリケーションを持っています。これは素晴らしく、私はそれらのファイルを提供するように設定しましたが、いくつかのユースケースでは、ファイルを取得してディスクに書き込む必要があります(pdfファイルをマージする)。URLからファイルを保存すると、まっすぐなRubyよりも遅くなりますか?

IRBまたは単純なRubyファイルから、私は次のコードを実行してファイルをほぼ即座に取得できますが、同じコードがRails内から呼び出されるとタイムアウトします。

require 'open-uri' 

open('id1_front.pdf', 'wb') do |file| 
    file << open('http://127.0.0.1:3000/files/uploads/id1_front.pdf').read 
    p file 
end 

- それはRailsの中でタイムアウトされるだろう、なぜ

Timeout::Error (Timeout::Error): 
    app/controllers/design_controller.rb:38:in `block in save' 
    app/controllers/design_controller.rb:37:in `save' 

誰もが知っていますか?ファイルをmongoから取り出してディスクに書き込むための代替ソリューション

ありがとうございました!

+0

ファイルがデッドロックしている可能性があります。ただ好奇心から - 私は2つのファイル名が同じであることに気付いた(あなたが書いている、あなたが読んでいる)。読んでいるファイルシステム上の同じファイルに書き込もうとしていませんか? – bblack

答えて

3

開発サーバーを実行している場合、要求に応答するスレッドは1つだけです。このスレッドは、リクエストが提供されているときにブロックされます。つまり、design_controller#saveをリクエストしてから、Webサーバーにアップロードされたファイルをリクエストします。この要求は、Webサーバーが以前のものを完了しようとしているため、決して正常に完了しません。

webrickの代わりにRailsサーバーとしてthinを使用すると、この問題を回避することができます。あなたのgemfileにgem thinを追加し、rails s thinでサーバを起動してください。これにより複数のリクエストが同時に処理されるようになるかどうかはわかりませんが、少なくとも1ショットの価値はあります。いくつかのテストの後

--EDIT--

私は薄いが、残念ながら、また、シングルスレッドであるため、この全く同じ問題を抱えていると判断。

Google検索のビットの後、私はshotgunを発見しました。それはしばらくの間アクティブではありませんでしたが、それはあなたの問題を解決するかもしれないようです、それは開発の要求ごとに新しいアプリケーションを生み出すためです。試してみます。

関連する問題