Rails并发请求

时间:2015-02-15 22:39:17

标签: ruby-on-rails ruby multithreading

所以我有一个用于解析长json文件的rails应用程序 - 在此期间它会向外部API发送请求,这似乎需要永远。我的问题是,为了加快速度,将每个请求粘贴到一个单独的线程中是否很简单?我不明白为什么我不能说3个或4个线程同时运行发送请求...我看到的唯一问题是当前该方法显示错误页面,如果在解析结束时出现任何错误 - 并且这可能不会发生,因为其他线程可能仍在运行? ..最终我想把这个方法变成一个rake任务并使用一个渲染html页面的cron作业运行它,以便更好地纠正?

def load_movies
 @errors = []
 movie_list = get_data

 movie_list.first(50).each do |movie_data|
 ------------ Thread.new do -----------
  movie = Movie.new
  movie.construct_movie movie_data

  if !movie.valid?
    @errors << movie
  else
   movie.save
  end
  ----------- end thread ------------
  unless @errors.count > 0
  redirect_to root_path
end
end

是否像上面那样简单,它将运行打开多个线程来发送请求(可以假设在construct_movie中

1 个答案:

答案 0 :(得分:3)

可以这样做,是的。我做到了,是的。

如果你正在使用ActiveRecord,你可以使用ActiveRecord的多线程使用来遇到一些问题。为了在ruby中执行多线程的东西,我推荐使用concurrent-ruby gem,它提供线程池和更高级别的抽象,如Futures。 https://github.com/ruby-concurrency/concurrent-ruby

可以这样做,但是,是的,它可能会变得棘手 - 如果后台作业队列有效,那对你来说可能是一个不那么重新发明的解决方案。无论是后台作业队列还是线程,您都必须弄清楚如何显示&#39;结果&#39; - 虽然使用直线方法,我猜你的请求可以在显示结果之前等待所有线程及其结果(是的,我也做过这个)。这可能会导致自身遇到运行缓慢的问题(您可能希望与puma或乘客企业一起部署,以避免阻止整个应用程序进程)。

根据我自己的经验做同样的事情,我没有一个简单的答案,无论你采取什么样的路线,我都会遇到一些挑战,我想。如果你能找到一种方法使后台作业队列工作,我认为这通常会比在应用程序进程中直接创建线程少得多。

相关问题