使用Rmagick和eventmachine

时间:2013-12-06 10:56:58

标签: ruby rmagick eventmachine grape goliath

我正在尝试使用Goliath和Grape创建一个非常简单的Web服务。我的服务所做的就是给定图像路径和目标尺寸,它将返回图像的新几何图形。这些映像存储在与Web服务主机相同的服务器中。

所以我在Grape中有这个代码:

# some Grape code omitted
get "/" do
  EM.defer {
    image = Magick::Image.read('path to image').first
    image.change_geometry('3000x3900') do |cols, row, img|
      return {width: cols, height: row}
    end
  }
end

当我在浏览器中访问端点时,我得到的就是这个字符串

"#<ConditionVariable:0x007ffd9de1f6e8>"

如果没有EM.defer,它会返回以下json但请求/秒非常低(约4 reqs / sec):

{width: 'new width', height: 'new heigth'}

如何使Rmagick操作无阻塞并使其返回结果?

1 个答案:

答案 0 :(得分:0)

看起来你把事情搞混了。

呼叫RMagick 总是阻止,因为它需要处理图像。好消息是grape本身的呼叫是非阻塞。这意味着,当您的单个客户端必须等待声称的1/3秒完成时,其他客户端仍然可以对请求进行排队。

我猜您的测试环境只是逐个调用相应的服务,等待请求完成。而不是你要从不同的线程调用服务,在准备就绪时获得结果。

希望它有所帮助。