ruby-on-rails - RMagick (ImageMagick) 在 fork 进程中运行时挂起

标签 ruby-on-rails ruby imagemagick multiprocessing rmagick

在带有 Ruby 1.8.7 的 Rails 3.0.0 实例上,我尝试使用 RMagick (2.13.0) 将一些图像处理任务推送到使用 fork() 的单独进程中。但是,当调用 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

如果我用 img.crop 替换 Magick::Image.new,进程也会挂起!有趣的是,如果我禁用 fork 并仅在与调用者相同的进程中运行 process_image 函数,一切正常!

我在网上找遍了,还是不明白为什么会这样。如果有人可以帮助我解决这个问题,我将不胜感激。谢谢!

  • 其他详细信息:我在开发环境中使用 WEBrick 和 MySQL

最佳答案

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

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

关于ruby-on-rails - RMagick (ImageMagick) 在 fork 进程中运行时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6606183/

相关文章:

ruby-on-rails - 回形针 - 图片上传错误 : "not recognized by the ' identify' command."

ruby-on-rails - 如何将数据传递给部分?

javascript - document.ready 没有触发?

ruby-on-rails - 使用 ruby​​ 衡量针对单个规范的代码覆盖率的最佳方法是什么?

php - 设置 PHP ImageMagick tmp 目录

c - MagickWand 库 : write to buffer instead of file

ruby-on-rails - ruby on has_many :through上的after_remove,after_add回调

ruby-on-rails - Ruby 中 GraphQL 类型的字段定义中感叹号的用途是什么?

ruby - 使用 Ruby 使用数据库 url 查询 Postgres 数据库

ruby-on-rails - Full Rails 5 路线与 Ancestry Gem 嵌套树