我有一长串物品清单。旁边有一个复选框。有一个jQuery check-all函数,但是当我一次提交所有这些函数时,请求会超时,因为它正在执行一堆查询,并在MySQL数据库中为每个项目插入一堆记录。如果不是超时,那可能需要大约20分钟。相反,我一次只提交30个。Ruby on Rails超时。我如何分叉进程?
我希望能够检查所有并提交,然后继续做其他工作。我的同事(1)说我应该写一个耙子任务。我这样做了,但是我最终重复了代码,并且我更喜欢用户界面,因为如果我想取消选中几个,该怎么办?耙子任务只是提交它们。
另一位同事(2)推荐我使用叉子。他说,这会产生一个新的进程在服务器上运行,但允许服务器在完成之前做出响应。然后,由于项目在提交后消失,我可以刷新页面以检查它们是否完成。
我在我的本地尝试了这个,但是,它似乎仍然在等待该过程完成,然后它才响应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表示,一般你不希望到餐桌的Rails,因为叉创建一个子进程,基本上是Rails的过程中的一个副本。他说,如果你想通过网络图形用户界面来完成,使用BackgroundJob(Bj)(因为我们已经在我们的Rails应用中使用了它)。所以,我现在正在研究BackgroundJob,但你推荐什么?
如何将散列作为参数传递给BackgroundJob? – ma11hew28 2011-02-07 02:59:32