ruby - 真正的 sinatra(ruby/rack) after_filter 最快的方法是什么?

标签 ruby performance sinatra callback

好的,这是一个简单的任务。在我向客户端呈现 html 之后,我想使用请求中的信息执行数据库调用。

我正在使用 sinatra,因为它是一个轻量级的微框架,但我真的支持 ruby​​ 中的任何东西,如果它更快/更容易(Rack?)。我只想获取 url 并根据 url 将客户端重定向到其他地方。

那么如何使用 rack/sinatra 作为一个真正的 after_filter。 after_filter 我的意思是在响应发送到客户端之后。还是没有线程就无法实现?

我 fork 了 sinatra 并在过滤器之后添加,但是没有办法刷新响应,即使是假设流式传输文件(显然是二进制文件)的 send_data 也在等待 after_filters。

我看过这个问题:Multipart-response-in-ruby但答案是铁轨。而且我不确定它是否真的将响应刷新到客户端,然后允许事后处理。

Rack::Callbacks 有一些之前和之后的回调,但即使是那些看起来会在响应发送到客户端之前运行的 Rack::Callbacks 实现(添加评论):

def call(env)
  @before.each {|c| c.call(env) }
  response = @app.call(env)
  @after.each {|c| c.call(env) }
  response 
  #i am guessing when this method returns then the response is sent to the client.
end

所以我知道我可以使用 rake 通过 shell 调用后台任务。但最好不要太...还有NeverBlock但这是否适合在不延迟响应的情况下执行单独的进程,或者它仍然会让应用程序等待整个过程(我认为会)?

我知道这很多,但简而言之,在 ruby​​/sinatra/rack 中发送响应后真正运行的 after_filter 很简单。

感谢阅读或回答我的问题! :-)

最佳答案

将 run_later 端口修改为 rails 以执行此操作文件可在此处获得:

http://github.com/pmamediagroup/sinatra_run_later/tree/master

关于ruby - 真正的 sinatra(ruby/rack) after_filter 最快的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/513491/

相关文章:

ruby-on-rails - 如何从 Ruby 1.8.7 中的 utf-8 字符串中获取第 i 个字符?

ruby - 如何捕获由对等方重置的错误连接 (Errno::ECONNRESET)

c# - 创建大列表<T>

ruby - Sinatra 全局应用程序变量

ruby - Sinatra 在 Ruby 1.9.2-p0 上找不到 View

ruby - 验证两列的唯一性

ruby-on-rails - ActionMailer 错误的参数数量错误

C++ - 大量可搜索数据的高效容器?

java - 监控 Tomcat 进程 CPU 峰值

json - 您如何将所有 Sinatra 响应设置为 JSON?