Ruby 1.8.7を使用しているRails 3.0.0のインスタンスでは、RMagick(2.13.0)を使用していくつかの画像処理タスクを別のプロセスにプッシュしようとしています。フォーク()。しかし、Magick :: Image.new、Magick :: Image.crop、またはMagick :: Image.compositeが呼び出されると、画像処理が行われる子プロセスが常に停止します。分岐したプロセスで実行すると、RMagick(ImageMagick)がハングする
「ぶら下がっている」とは、プロセスがその特定のコマンドに固執してしまうということです。その行を超えたり例外をスローしたりすることはなく、手動でプロセスを終了させる必要があります。さらに、子プロセスは、スタックされているときに追加のメモリを使用しているようには見えません。実際に何が起こっているのかはわかりません。
関連するコードがやや次のようになります。私はimg.crop
でMagick::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とは何かを持っていることを推測する私の開発環境
私のワークステーション上でうまくいきましたが、これはRailsの+ RMagickの組み合わせに固有の問題のように思える私をビット。私はちょうどそれが起こる理由を理解しようとしています –
Railsでフォークは最良の方法ではなく、サーバーに依存します。 Railsでバックグラウンドジョブを検索するには、多くの選択肢があります。 –
私はフォークの理由があります。バックグラウンドジョブはいつでも1つのリクエストしか処理できません。私は、ジョブを提出した直後にユーザーの要求を開始したい。スレッディングは別のオプションです。私はそれを試し、結果をここに報告します。 –