我有一个网站,需要使用Nokogiri在许多不同的网站上提取数据。此进程使用delayed_job gem作为后台作业运行。然而,每个页面需要大约3-4秒才能运行,因为它必须暂停并等待其他网站的响应。我现在只是通过简单地说
Websites.all.each do |website|
# screen scrape
end我想分批执行它们,而不是一个一个,这样我就不必等待每个站点的服务器响应(有时可能需要20秒)。
最好的ruby或rails方式是什么?
提前感谢您的帮助。
发布于 2011-03-21 21:28:51
您需要使用延迟作业。看看这个Railscasts。
请记住,大多数主机都会对这种类型的东西收费。
如果你不关心管理线程,你也可以使用spawn插件,但它要简单得多!
这就是你所需要做的:
rails plugin/install https://github.com/tra/spawn.git例如:
spawn do
#execute your code here :)
end http://railscasts.com/episodes/171-delayed-job
发布于 2011-03-21 21:34:04
您可能想要查看Typhoeus,它使您能够发出并行的http请求。
我找到了a short blawg post here关于在诺基里使用它,但我自己还没有尝试过。
封装在DJ中,这应该可以在客户端延迟很小的情况下完成任务。
发布于 2011-12-19 18:44:40
我正在使用EventMachine为当前项目做类似的事情。有一个很棒的插件,叫做em- HTTP -request,它允许你并行地发出多个HTTP请求,并提供同步响应的选项。
来自the em-http-request github docs:
EventMachine.run {
http1 = EventMachine::HttpRequest.new('http://google.com/').get
http2 = EventMachine::HttpRequest.new('http://yahoo.com/').get
http1.callback { }
http2.callback { }
end所以在你的情况下,你可以
callbacks = []
Websites.all.each do |website|
callbacks << EventMachine::HttpRequest.new(website.url).get
end
callbacks.each do |http|
http.callback { }
end使用瘦get服务器运行您的rails应用程序,以获得正常运行的EventMachine循环:
bundle exec rails server thin您还需要eventmachine和em-http-request gem。祝好运!
https://stackoverflow.com/questions/5378162
复制相似问题