【发布时间】: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