在使用Ruby 1.8.7的Rails 3.0.0實例中,我試圖使用RMagick(2.13.0)將一些圖像處理任務推送到單獨的進程中叉子()。但是,圖像處理髮生的子進程始終會在調用Magick :: Image.new,Magick :: Image.crop或Magick :: Image.composite時掛起。 「掛」我的意思是這個過程只是停留在那個特定的命令上;它既沒有超過那條線也沒有拋出任何異常,我必須手動殺死這個進程。另外,子進程在卡住時似乎沒有使用任何額外的內存,這真的讓我想知道它實際上在做什麼。RMagick(ImageMagick)在分叉進程中運行時掛起
相關的代碼看起來有點像這樣:(這是不實際的代碼!)
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
如果我更換Magick::Image.new
與img.crop
,過程中也將掛起!有趣的部分是,如果我禁用分叉,並在與調用方相同的進程中運行process_image函數,則一切正常!
我在互聯網上搜索了所有內容,但仍然無法弄清楚爲什麼會發生這種情況。如果有人能幫助我解決這個問題,我會非常感激。謝謝!
- 其他詳細信息:我使用的WEBrick和MySQL我的開發環境
沒有,但是這似乎是具體到了Rails + RMagick組合存在問題;我只是想了解它爲什麼會發生 –
分叉不是Rails中的最佳方式,取決於服務器。在Rails中搜索後臺作業,有很多選擇。 –
我有我的理由:後臺作業只能隨時處理1個請求;我希望用戶的請求在提交作業後立即開始。線程是另一種選擇;我會嘗試它並在此處報告結果。 –