2011-07-07 7 views
3

Ruby 1.8.7を使用しているRails 3.0.0のインスタンスでは、RMagick(2.13.0)を使用していくつかの画像処理タスクを別のプロセスにプッシュしようとしています。フォーク()。しかし、Magick :: Image.new、Magick :: Image.crop、またはMagick :: Image.compositeが呼び出されると、画像処理が行われる子プロセスが常に停止します。分岐したプロセスで実行すると、RMagick(ImageMagick)がハングする

「ぶら下がっている」とは、プロセスがその特定のコマンドに固執してしまうということです。その行を超えたり例外をスローしたりすることはなく、手動でプロセスを終了させる必要があります。さらに、子プロセスは、スタックされているときに追加のメモリを使用しているようには見えません。実際に何が起こっているのかはわかりません。

関連するコードがやや次のようになります。私はimg.cropMagick::Image.newを交換した場合(!これは、実際のコードではありません)

def trigger_fork 
    img_content = get_image_content 
    p = Process.fork { process_image(img_content) } 
    Process.detach(p) 
    redirect_to root_path 
end 

def process_image(img_content) 
    img = Magick::Image.from_blob(img_content) # this works fine! 
    composite_image(img) 
end 

def composite_image(img) 
    # child process gets stuck here!! 
    dummy = Magick::Image.new(100,100) { self.background_color = "white" } 

    img.composite(dummy, 0, 0, Magick::XorCompositeOp) 
end 

、プロセスもハングアップします!興味深いのは、私がフォークを無効にして、呼び出し元と同じプロセスでprocess_image関数を実行するだけで、すべて正常に機能するということです。

私はインターネット全体を検索しましたが、これがなぜ起こっているのかまだ分かりません。誰かがこの問題で私を助けることができたら本当に感謝します。ありがとう!

  • 追加詳細:私は、これはRailsの過程で何が起こっている場合は、私はそれが道RubyとRMagickとは何かを持っていることを推測する私の開発環境
+0

私のワークステーション上でうまくいきましたが、これはRailsの+ RMagickの組み合わせに固有の問題のように思える私をビット。私はちょうどそれが起こる理由を理解しようとしています –

+0

Railsでフォークは最良の方法ではなく、サーバーに依存します。 Railsでバックグラウンドジョブを検索するには、多くの選択肢があります。 –

+0

私はフォークの理由があります。バックグラウンドジョブはいつでも1つのリクエストしか処理できません。私は、ジョブを提出した直後にユーザーの要求を開始したい。スレッディングは別のオプションです。私はそれを試し、結果をここに報告します。 –

答えて

1

ためにWEBrickにとMySQLを使用していますハンドルメモリ。 RMagickはメモリの問題があることで知られており、Railsはこのようなことをやろうとするのに親しみがないことで知られています。

私はこのためにバックグラウンドジョブを強くお勧めします。タイミング制約がある場合は、適時に処理される十分な人員とリソースを追加するだけです。この方法の問題は、この問題を解決しても一度は止まらないでしょう。

0

私は透かしスクリプトで同じ問題を抱えていました。

私は透かし画像を生成していましたが、他の画像に透かしを合成したいくつかのプロセスをフォークしていました。労働者はcompositeと呼ぶときに立ち往生した。ウォーターマークの生成コードをforkブロックに移動すると、私のために修正されました。

経験則として、含まれるRMagickを扱うコードを1つのプロセスに保つようにしてください。

注:このバグは、私だけが生産にコードを移動したとき、すべてが無

関連する問題