【发布时间】:2016-01-16 13:15:56
【问题描述】:
我想在不使用超时模块的情况下在控制器的操作中实现以下行为:
class AdminController < ApplicationController
def example
Timeout.timeout(params[:timeout].to_i) do
... # try to process the request within params[:timeout] seconds
end
rescue Timeout::Error
render nothing: true, status: :gateway_timeout
end
end
我想避免使用 Timeout,因为它会在我的应用程序中导致许多错误,包括数据库连接泄漏。其他一些问题报告在: http://www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/
【问题讨论】:
-
你在这个请求中实际做了什么?对于更大的问题,超时是一个糟糕的解决方案 - 您可能能够预处理或将其中一些代码转换为作业,甚至可以使用状态机将请求拆分为多个阶段。
-
@court3nay 这是一个运行可能需要 100 毫秒到 30 秒才能处理的作业的 Web 服务。每个客户端都可以为请求的作业指定自己可接受的超时时间。
-
@barbolo 您当前的代码存在缺陷。最好将超时包装在
begin块中,然后是rescue => e。你想达到什么目的?如果查询时间过长,是否停止请求? -
代码被包裹在一个“try/catch”结构中,我只是没有使用begin。
-
如果请求时间过长,我想停止请求。是的。但是“太长”应该是可配置的。
标签: ruby-on-rails ruby thread-safety timeout