Rails并发请求

所以我有一个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 < 0 redirect_to root_path end end 

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

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

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

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

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