bar*_*olo 9 ruby timeout ruby-on-rails thread-safety
我希望在没有使用Timeout模块的情况下在控制器的操作中实现以下行为:
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
Run Code Online (Sandbox Code Playgroud)
我想避免使用Timeout,因为它导致我的应用程序中出现许多错误,包括数据库连接泄漏.报告的其他一些问题:http: //www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/
不要为此使用红宝石。问题是超时模块会在执行代码中的任何地方中止代码,这将导致打开和悬空的套接字、连接和文件或更糟的情况。(我猜,如果您启动外部脚本或为每项工作付出代价,这并不是真正的问题,但在这些情况下,只需使用 unix/linux 本机 io 超时)
这几乎就是为什么 ruby CI 服务器从未流行起来的原因(Jenkins 是 java)。我会用一个单独的服务来设计它,该服务可以处理正在运行的作业,您可以使用 API 进行 ping 操作;然后,在您看来,每隔几秒钟就对其进行 ping 操作,以便他们可以看到持续的更新。在这种情况下,rails 应用程序不需要包含任何污染超时代码。
编辑:由于您在该块中执行 HTTP 请求,因此只需使用 http 库中内置的超时设置(例如https://github.com/lostisland/faraday)
| 归档时间: |
|
| 查看次数: |
1062 次 |
| 最近记录: |