1

我正在寻找一种在页面呈现给用户之后运行一些慢代码的方法。具体来说,我希望能够做这样的事情:

get '/fast-action' do
  compute_after_render { put some slow code here }
  'request successful'
end

我考虑将有关计算的信息插入数据库。然后运行类似 rufus 调度程序的东西,它会检查是否每分钟计算一次。
但我不希望用户等待数据库完成插入。

在页面呈现给用户之后,有什么方法可以让 Sinatra 运行一些代码?

4

3 回答 3

2

是的,一种快速简便的方法是开始一个新线程:

get '/fast-action' do
  body 'request successful'
  Thread.new{ slow code }
end
于 2014-11-08T14:43:06.587 回答
1

您可以使用流式响应

get '/fast-action' do
  stream do |out|
    out << 'request successful'
    put some slow code here
    out << " "
  end
end

但请注意,该服务器线程将在该请求期间被阻塞(当然还有执行慢代码)。

于 2014-11-08T14:42:10.433 回答
1

建议你看看兼职。我喜欢为此使用Sidekiq gem。它使用 Redis 存储需要运行的作业,并每隔一段时间检查一次。它是完全可配置的。如果您正在运行可以稍后完成的作业,例如发送电子邮件、处理图像等,以及运行较长的进程,我强烈建议您使用它。

于 2014-11-12T04:49:17.173 回答