【问题标题】:RMagick (ImageMagick) hangs when run in a forked processRMagick (ImageMagick) 在分叉进程中运行时挂起
【发布时间】:2011-07-07 05:28:39
【问题描述】:

在带有 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,进程也会挂起!有趣的是,如果我禁用分叉并在与调用者相同的进程中运行 process_image 函数,一切正常!

我在整个互联网上进行了搜索,但仍然无法弄清楚为什么会发生这种情况。如果有人可以帮助我解决这个问题,我将不胜感激。谢谢!

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

【问题讨论】:

  • 不,但这似乎是 Rails+RMagick 组合特有的问题;我只是想了解它为什么会发生
  • 分叉不是 Rails 中最好的方式,取决于服务器。在 Rails 中搜索后台作业,有很多选择。
  • 我有我的分叉理由:后台作业在任何时候只能处理1个请求;我希望用户的请求在提交作业后立即开始。线程是另一种选择;我会尝试并在这里报告结果。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我在水印脚本方面遇到了同样的问题。

    我正在生成水印图像,然后分叉了一些将水印合成到其他图像上的过程。工人在拨打composite 时卡住了。将水印生成代码移动到 fork 块中为我修复了它。

    根据经验,尽量将处理 RMagick 的代码包含在单个进程中。

    注意:这个错误只在我将代码移到生产环境时才让我感到困扰,在我的工作站上一切正常

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多