gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:57:31 25 4
gpt4 key购买 nike

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

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

# code code
halt send_blank if is_blocked? SETTINGS, host
# code code

最后我想要这样的东西:

response.body = JSON.generate(outgoing)
# update user
STATISTICS.hset('u:' + userID, 'data', JSON.generate({'ip' => request.ip, 'time' => Time.now.to_f.to_s}))

是否可以发送响应然后执行 5~ ms 的 redis 写入,以便客户端不必等待?无论我在哪里或如何放置最终统计 redis 调用,它都会延迟一些 ms 的响应发送 - 无法欺骗 sinatra。

这可以在 Node 中轻松完成,只需编写我想要完成的内容,它就会在响应发送后触发;据我了解,此处的代码会在返回响应之前阻止执行大约 5 毫秒。

我试过使用 after .. do 过滤器,它们可以正常工作,除了你不能传递给它们除了 response.body 中的数据之外的任何东西 - 这意味着你不能传递给过滤器任何不是即将输出!可以通过分配给 post("/") 范围之外的变量来避免这个问题,但是每秒 100 多个请求,我希望你能看到通过各种“全局变量”交换数据如何成为一个大问题。

这看起来真的很简单,但我找不到比在文档中做过滤器之后更好的东西了。

我可以创建一个线程或其他东西来使 redis.hset() 进程成为非阻塞的,这样行得通吗?看起来像是硬核黑客。

谢谢!

最佳答案

fork redis 写入应该可行。

像这样:

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

关于ruby - 如何发送响应但继续在 Sinatra 中执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12328183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com