gpt4 book ai didi

ruby-on-rails - Ruby on Rails 超时。我如何 fork 一个进程?

转载 作者:太空宇宙 更新时间:2023-11-03 18:00:55 25 4
gpt4 key购买 nike

我有一长串项目的页面。每个旁边都有一个复选框。有一个 jQuery 检查所有功能,但是当我一次提交所有这些时,请求超时,因为它正在执行一堆查询并在 MySQL 数据库中为每个项目插入一堆记录。如果它没有超时,它可能需要大约 20 分钟。相反,我一次只提交 30 个。

我希望能够检查所有内容并提交,然后继续做其他工作。我的同事 (1) 说我应该写一个 rake 任务。我这样做了,但我最终重复了代码,而且我更喜欢用户界面,因为如果我想取消选中一些怎么办? rake 任务只是提交它们。

另一位同事 (2) 推荐我使用 fork。他说这会产生一个新进程,该进程将在服务器上运行,但允许服务器在完成之前做出响应。然后,由于项目在提交后消失,我可以刷新页面以检查它们是否已完成。

我在我的本地尝试过这个,但是,Rails 似乎仍然在等待进程完成,然后才能响应 HTML 表单发送的 POST 请求。我使用的代码如下所示:

def bulk_apply
pid = fork do
params[:ids].each do |id|
Item.find(id).apply # takes a LONG time, esp. x 100
end
end
Process.detach(pid) # reap child process automatically; don't leave running
flash[:notice] = "Applying... Please wait... Then, refresh page. Only submit once. PID: #{pid}"
redirect_to :back
end

同事 1 说,通常您不想 fork Rails,因为 fork 会创建一个基本上是 Rails 进程副本的子进程。他说如果你想通过 web GUI 来完成它,请使用 BackgroundJob (Bj)(因为我们已经在我们的 Rails 应用程序中使用它)。所以,我现在正在研究 BackgroundJob,但您有什么建议?

最佳答案

我使用后台作业取得了很好的成功。如果您需要 rails,您将使用 script/runner,它仍然会使用 rails 启动一个新进程。好处是 Backround Job 将确保一次不会有超过一个运行。

您也可以直接使用脚本运行器,甚至可以像这样在后台运行 rake 任务:

system " RAILS_ENV=#{RAILS_ENV}   ruby  #{RAILS_ROOT}/script/runner   'CompositeGrid.calculate_values(#{self.id})'  & " unless RAILS_ENV == "test"

& 符号告诉它开始一个新进程。要小心,因为您可能不希望同时运行这些。如果后台工作已经可用,我肯定会利用它。

关于ruby-on-rails - Ruby on Rails 超时。我如何 fork 一个进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4878949/

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