如果Sinatra的响应返回一个'eachable'对象,Sinatra的事件循环将'each'您的结果,并以流式方式在HTTP响应中产生结果。但是,如果有并发请求到达Sinatra,则它将在处理另一个请求之前遍历一个响应的所有元素。如果我们有一些DB查询结果的光标,这意味着我们必须等待所有数据可用后才能处理并发查询。
我已经查看了async-sinatra gem和http://macournoyer.com/blog/2009/06/04/pusher-and-async-with-thin/,认为它们可以解决我的问题,但我尝试了这个示例:
我已经查看了async-sinatra gem和http://macournoyer.com/blog/2009/06/04/pusher-and-async-with-thin/,认为它们可以解决我的问题,但我尝试了这个示例:
require 'sinatra/async'
class AsyncTest < Sinatra::Base
register Sinatra::Async
aget '/' do
body "hello async"
end
aget '/delay/:n' do |n|
EM.add_timer(n.to_i) { body { "delayed for #{n} seconds" } }
end
end
同时,我希望/delay/5
请求可以像我期望的那样并发工作,即我同时发出3个请求,Chrome调试器将响应时间记录为大约5、10和15秒。
我是否缺少一些设置或者有其他方法告诉Sinatra/Thin以并发方式处理请求?
更新:这里还有另一个问题(或者可能解决了问题):curl -i http://localhost:3000/delay/5
在并发运行时具有正确的行为(每个请求都在约5秒内返回)。运行ab -c 10 -n 50 http://locahost:3000/delay/5
(Apache基准实用程序)也对总时间返回了合理的结果(约25秒)。Firefox表现与Chrome相同。浏览器与命令行实用程序有何不同?
defer
一个proc
,并有一个回调proc
在延迟的代码完成时执行。顺便说一下,所涉及的数据库是MongoDB,并且我们拥有一个返回结果的游标。问题在于告诉Sinatra并发地迭代游标,并同时从独立的游标生成响应。 - Kenny Peng