Ruby on rails 使用Rails中的线程从控制器-进度条动态更改视图
我的控制器中有一个耗时任务,我想在视图中触发一个简单的进度条/进度状态 在我的控制器中,我有类似Ruby on rails 使用Rails中的线程从控制器-进度条动态更改视图,ruby-on-rails,multithreading,progress-bar,render,Ruby On Rails,Multithreading,Progress Bar,Render,我的控制器中有一个耗时任务,我想在视图中触发一个简单的进度条/进度状态 在我的控制器中,我有类似 threads = [] total.times do |x| Thread.new { the_time_taking_task(x) #Something here to trigger the progressbar in the view } end threads.each { |aThread| aThread.join } rende
threads = []
total.times do |x|
Thread.new {
the_time_taking_task(x)
#Something here to trigger the progressbar in the view
}
end
threads.each { |aThread| aThread.join }
render :action => 'some_action'
我不能在那里放置渲染,因为它会引发双重渲染错误。
我尝试将渲染和返回放在那里,但得到了“return无法跨线程跳转”错误
我正在尝试渲染,因为这似乎是我的控制器与视图对话的唯一方式。我的方法错了吗
在视图中需要这样简单的东西,通过该调用应用进度条宽度
<div style="width: <%= (percent_val)%>px; ">
请给出建议。是的,这是一种错误的方法
Web是无状态的,您不能阻止一个进程来呈现视图并通过另一个请求获取它
好办法是:
1) 生成队列任务而不是线程。您可以使用延迟的_作业、resque或队列系统,如rabbitMQ或beanstalkD
2) 添加一个控制器以检查队列中的进程是否已结束以及进度如何。在内部,放入队列id并检查是否结束,然后返回进度百分比
最简单的方法是通过Ajax实现。是的,这是一种错误的方法
Web是无状态的,您不能阻止一个进程来呈现视图并通过另一个请求获取它
好办法是:
1) 生成队列任务而不是线程。您可以使用延迟的_作业、resque或队列系统,如rabbitMQ或beanstalkD
2) 添加一个控制器以检查队列中的进程是否已结束以及进度如何。在内部,放入队列id并检查是否结束,然后返回进度百分比
最简单的方法是通过Ajax实现。是的,您的方法是错误的
辛加拉很好地解释了这一点
我为你提供了一个更具体的解决方案
要获得想要的效果,基本上需要以下步骤:
将线程卸载到后台作业服务器中。结帐或付款
让后台作业将进度写入数据库或某种持久介质
在Rails中,编写一个返回当前进度的操作(作为json或xml)
在您看来,编写一个定期的ajax请求来调用步骤3中编写的操作
相应地更新视图
你完了!:是的,你的方法是错误的
辛加拉很好地解释了这一点
我为你提供了一个更具体的解决方案
要获得想要的效果,基本上需要以下步骤:
将线程卸载到后台作业服务器中。结帐或付款
让后台作业将进度写入数据库或某种持久介质
在Rails中,编写一个返回当前进度的操作(作为json或xml)
在您看来,编写一个定期的ajax请求来调用步骤3中编写的操作
相应地更新视图
你完了!:D任何长时间运行的任务都应作为后台进程运行(异步和非阻塞)。正如@shingara所说的,使用延迟的工作或类似的工作。我发现延迟工作是迄今为止最容易实现的。签出延迟作业上的RailsCast。任何长时间运行的任务都应作为后台进程运行(异步和非阻塞)。正如@shingara所说的,使用延迟的工作或类似的工作。我发现延迟工作是迄今为止最容易实现的。检查延迟工作的铁路乘客。