我是Rails和多线程的新手,我很好奇如何以最优雅的方式实现以下目标。 我找不到任何好的教程,详细解释了以下任务的最佳设计决策:
我有几个HTTP请求将在后台为用户运行,例如,解析几个网站并获取一些信息,如HTTP响应代码,响应时间,然后返回结果。出于性能原因,我决定将要解析的URL总数分成25个批处理,然后在一个线程中执行每个批处理,加入这些并将结果写入数据库。
我决定使用以下gem(http://rubygems.org/gems/thread)来确保同时运行最大线程数。到现在为止还挺好。
问题是,如果两个用户并行开始分析,则最大线程数是我的线程池最大值的两倍。
我的解决方案(imho)是创建一个自己运行的worker守护程序,并等待来自客户端的作业。
我的问题是,在Rails中实现这一目标的最佳方法是什么?
也许创建一个Rake任务,并将其用作守护进程(请参阅:“Daemoninsing a rake task”)和(如何?)向其添加作业?
非常感谢你!
答案 0 :(得分:0)
我在数据库的表中构建了一个队列,并且cron会定期启动一些代码,它会遍历该表,并将请求传递给Typhoeus and Hydra。
以下是作者总结宝石的方法:
像具有100个蛇头的神话兽的现代代码版本一样,Typhoeus并行运行HTTP请求,同时干净地封装处理逻辑。
当用户添加请求时,将它们附加到表中。您需要以下字段:
Typhoeus和Hydra易于使用,并且可以轻松处理多种请求。
答案 1 :(得分:0)
Rails有很多库可以为您管理长时间运行的后台作业的队列。以下是一些:
一旦你选择了一个,我建议使用Foreman来简化一次启动多个守护进程。