RMagick(ImageMagick)在分叉进程中运行时挂起

时间:2011-07-07 05:28:39

标签: ruby-on-rails ruby imagemagick multiprocessing rmagick

在使用Ruby 1.8.7的Rails 3.0.0实例上,我试图使用fork()将一些使用RMagick(2.13.0)的图像处理任务推送到一个单独的进程中。但是,当调用Magick :: Image.new,Magick :: Image.crop或Magick :: Image.composite时,进行图像处理的子进程总是挂起。

通过“悬挂”我的意思是这个过程只是卡在那个特定的命令上;它既不会超过该行也不会引发任何异常,我必须手动终止该进程。此外,子进程在卡住时似乎没有使用任何额外的内存,这让我想知道它实际上在做什么。

相关代码看起来有点像这样:(这不是实际代码!)

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,则该过程也会挂起!有趣的是,如果我禁用forking并且只是在与调用者相同的进程中运行process_image函数,那么一切正常!

我在互联网上搜索过,但仍然无法弄清楚为什么会这样。如果有人可以帮我解决这个问题,我真的很感激。谢谢!

  • 其他细节:我正在使用WEBrick和MySQL作为我的开发环境

2 个答案:

答案 0 :(得分:1)

如果在Rails过程中发生这种情况,我猜它会与Ruby和RMagick处理内存的方式有关。 RMagick因存在内存问题而闻名,而Rails因尝试做这样的事情而不友好。

我强烈推荐一份后台工作。如果您有时间限制,只需添加足够的工作人员和资源,以便及时处理。如果您解决了这个问题,这种方法的问题不会停止一次。

答案 1 :(得分:0)

我在使用水印脚本时遇到了同样的问题。

我正在生成水印图像,然后分支合成水印而不是其他图像的几个过程。在致电composite时,工人们陷入困境。将水印生成代码移动到fork块中为我修复了它。

根据经验,尝试将处理RMagick的代码保存到单个进程中。

注意:当我将代码移至生产环境时,这个错误只会让我感到厌烦,一切都在我的工作站上运行良好