Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 将Rmagick与eventmachine一起使用_Ruby_Rmagick_Eventmachine_Grape_Goliath - Fatal编程技术网

Ruby 将Rmagick与eventmachine一起使用

Ruby 将Rmagick与eventmachine一起使用,ruby,rmagick,eventmachine,grape,goliath,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

我试图用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>"

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

看起来您把事情弄混了

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

我猜您的测试环境只是逐个调用相应的服务,等待请求完成。而不是从单独的线程调用服务,在它们准备好时获得结果


希望有帮助。

我知道Rmagick会阻止我的应用程序,因此我尝试使用EM.defer。也许我的EM.defer实现有问题?我建议您在
Grape
后面有
Sinatra
,对吗?您不需要重新实现
Sinatra
功能,请参阅
threaded
选项。无论如何,在
get
块中实现
EM#defer
是错误的,因为客户端在这里等待响应,而您无法从已经阻塞的方法中阻止阻塞。但是,您可以不为所有其他请求阻塞反应器线程,这就是OP使用EM.deferSee的原因,
op
参数是代码中的
&block
,它在单独的线程中执行,而
回调
参数则是reactor触发一次的代码块
EM.defer
返回结果。看看是否可以从EM.defer的回调块返回响应
{width: 'new width', height: 'new heigth'}