【发布时间】:2009-02-04 21:39:51
【问题描述】:
好的,这是一个简单的任务。在将 html 呈现给客户端后,我想使用请求中的信息执行 db 调用。
我使用 sinatra 是因为它是一个轻量级的微框架,但如果它更快/更容易(Rack?),我真的很喜欢 ruby 中的任何东西。我只想获取 url 并根据 url 将客户端重定向到其他地方。
那么,如何使用 rack/sinatra 作为一个真正的 after_filter。而 after_filter 我的意思是在响应发送到客户端之后。还是说没有线程就无法实现?
我分叉了 sinatra 并添加了过滤器,但没有办法刷新响应,即使是假定流文件的 send_data(显然是二进制文件)也等待 after_filters。
我看过这个问题:Multipart-response-in-ruby,但答案是针对 rails 的。而且我不确定它是否真的刷新对客户端的响应,然后允许处理。
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,但这对于在不延迟响应的情况下执行单独的进程是否有好处,或者它仍然会使应用程序整体等待(我认为它会)?
我知道这很多,但简而言之,它是一个简单的 after_filter,它在 ruby/sinatra/rack 中发送响应之后真正运行。
感谢您阅读或回答我的问题! :-)
【问题讨论】:
标签: ruby performance sinatra callback