gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:10:28 25 4
gpt4 key购买 nike

在带有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com