将Rmagick与eventmachine一起使用



我正试图用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个请求/秒):

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

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

看起来有点混乱。

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

我猜您的测试环境只是一个接一个地调用相应的服务,等待请求完成。相反,您要从单独的线程调用服务,在准备好时获得结果。

希望能有所帮助。

相关内容

  • 没有找到相关文章