2011-07-07 77 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)在分叉進程中運行時掛起

相關的代碼看起來有點像這樣:(這是不實際的代碼!)

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.newimg.crop,過程中也將掛起!有趣的部分是,如果我禁用分叉,並在與調用方相同的進程中運行process_image函數,則一切正常!

我在互聯網上搜索了所有內容,但仍然無法弄清楚爲什麼會發生這種情況。如果有人能幫助我解決這個問題,我會非常感激。謝謝!

  • 其他詳細信息:我使用的WEBrick和MySQL我的開發環境
+0

沒有,但是這似乎是具體到了Rails + RMagick組合存在問題;我只是想了解它爲什麼會發生 –

+0

分叉不是Rails中的最佳方式,取決於服務器。在Rails中搜索後臺作業,有很多選擇。 –

+0

我有我的理由:後臺作業只能隨時處理1個請求;我希望用戶的請求在提交作業後立即開始。線程是另一種選擇;我會嘗試它並在此處報告結果。 –

回答

1

如果這是在Rails的過程中發生的,我猜想,這有什麼做的方式Ruby和RMagick處理內存。 RMagick以存在內存問題而聞名,而Rails因嘗試執行這樣的事情而不友善而出名。

我強烈建議爲此做一個後臺工作。如果您有時間限制,只需添加足夠的工作人員和資源,以便及時處理。如果你解決了這個問題,你的問題就不會停止。

0

我對水印腳本有同樣的問題。

我正在生成水印圖像,然後分叉幾個過程,將水印合成到其他圖像上。致電composite時,工人被卡住了。將水印生成代碼移動到fork塊中爲我解決了問題。

作爲一個經驗法則,試着保持處理包含在單個進程中的RMagick的代碼。

注:該錯誤只咬了我,當我提出的代碼到生產,一切都工作得很好我的工作站