Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用Rails中的线程从控制器-进度条动态更改视图_Ruby On Rails_Multithreading_Progress Bar_Render - Fatal编程技术网

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所说的,使用延迟的工作或类似的工作。我发现延迟工作是迄今为止最容易实现的。检查延迟工作的铁路乘客。