Ruby 如何在Sinatra中发送响应但继续执行?

Ruby 如何在Sinatra中发送响应但继续执行?,ruby,performance,sinatra,redis,rack,Ruby,Performance,Sinatra,Redis,Rack,我正在制作一个小的sinatra应用程序。它进行几个Redis调用,返回数据,然后进行最后一个Redis调用以保存“统计信息” 到目前为止,如果我想提前终止请求(基于输入),我发现我可以使用: 最后,我希望有这样的东西: response.body = JSON.generate(outgoing) # update user STATISTICS.hset('u:' + userID, 'data', JSON.generate({'ip' => request.ip, 'time' =

我正在制作一个小的sinatra应用程序。它进行几个Redis调用,返回数据,然后进行最后一个Redis调用以保存“统计信息”

到目前为止,如果我想提前终止请求(基于输入),我发现我可以使用:

最后,我希望有这样的东西:

response.body = JSON.generate(outgoing)
# update user
STATISTICS.hset('u:' + userID, 'data', JSON.generate({'ip' => request.ip, 'time' => Time.now.to_f.to_s}))
response.body = JSON.generate(outgoing)
fork do
    # update user
    redis = Redis.new(:host => "your_host_name", :port => your_port_number)
    redis.hset('u:' + userID, 'data', JSON.generate({'ip' => request.ip, 'time' => Time.now.to_f.to_s}))
end
是否可以发送响应,然后进行5毫秒redis写入,这样客户端就不必等待?无论我将最终的统计redis调用放在何处或如何放置,它都会延迟某些ms发送响应-无法欺骗sinatra

这可以很容易地在Node中完成,但只需写下我想要做的事情,在发送响应后就会触发;据我所知,这里的代码将在回击响应之前阻止执行大约5毫秒

我试过用后。。做过滤器,它们会工作得很好,只是除了response.body中的数据之外,你不能向它们传递任何东西——这意味着你不能向过滤器传递任何不会被输出的东西! 通过将变量分配到post(“/”)范围之外,可以避免这个问题,但是对于每秒100多个请求,我希望您能够看到通过“全局”排序交换数据如何成为一个巨大的问题

这看起来很简单,但我找不到比这更好的了。。在文档中进行筛选

我可以创建一个线程或其他东西使redis.hset()进程无阻塞吗?这样行吗?看起来像是在做硬核


谢谢

将redis写入分叉应该会起作用

大概是这样的:

response.body = JSON.generate(outgoing)
# update user
STATISTICS.hset('u:' + userID, 'data', JSON.generate({'ip' => request.ip, 'time' => Time.now.to_f.to_s}))
response.body = JSON.generate(outgoing)
fork do
    # update user
    redis = Redis.new(:host => "your_host_name", :port => your_port_number)
    redis.hset('u:' + userID, 'data', JSON.generate({'ip' => request.ip, 'time' => Time.now.to_f.to_s}))
end

Forking似乎在heroku上的sinatra中出现故障:**glibc检测到***ruby:double free或Corrupt(!prev):0x0000000003824b20***应用程序[web.1]:===========================回溯:=========应用程序[web.1]:/lib/libc.so.6(+0x775b6)[0x7fef9d8385b6]应用程序[web.1]:/lib lib libc.so.6(cfree+0x73)[0x7fef9d83ee83]本机线程在MRI上不可用,只有jRuby和Rubinius。我可以推荐鲁宾尼乌斯吗?