ruby-on-rails - Rails 并发请求

标签 ruby-on-rails ruby multithreading

所以我有一个 Rails 应用程序,它解析一个长的 json 文件 - 在此期间它向外部 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 中

最佳答案

可以做到这一点,是的。我已经做到了,是的。

如果您正在使用 ActiveRecord,您可能会在多线程使用 ActiveRecord 时遇到一些问题。对于在 ruby​​ 中做多线程的东西,我推荐 concurrent-ruby gem,它提供线程池和更高级别的抽象,如 Futures。 https://github.com/ruby-concurrency/concurrent-ruby

可以做到这一点,虽然,是的,它可能会变得棘手——如果后台作业队列有效,这对您来说可能不是一个需要重新发明轮子的解决方案。无论是后台作业队列 还是 线程,您都必须弄清楚如何显示“结果”——尽管使用直接线程方法,我想您的请求可以在所有线程上等待并且他们的结果,在显示结果之前(是的,我也这样做过)。这可能会导致请求运行缓慢的问题(您可能希望与 puma 或 passenger enterprise 一起部署,以避免阻塞整个应用程序进程)。

根据我自己做类似事情的经验,我没有一个简单的答案,我认为无论你走哪条路,你都会遇到一些挑战。如果你能想出一种方法让后台作业队列工作,我认为这通常比直接在应用程序进程中创建线程给你带来更少的麻烦。

关于ruby-on-rails - Rails 并发请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28532077/

相关文章:

ruby - 无法使用字符串 'post' 但使用 'POST' 识别表单。 html 包含 'post'

如果从计时器任务调用,Android 对话框根本不显示

ruby-on-rails - 为什么 'rake test' 试图连接到我的开发数据库?

ruby-on-rails - 使用 Rails 3 + OmniAuth + FBGraph 从 facebook 添加好友

javascript - .js.erb 中的 NoMethodError

ruby-on-rails - form_for - Ruby on Rails

java通知所有: illegalMonitorStateException

c++ - LD_PRELOAD 和线程局部变量

ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用?

ruby-on-rails - 在嵌入式 ruby​​ 中指定 link_to 的类