目前,Typhoeus在发生故障时没有自动重新下载。如果下载不成功,确保重试的最佳方法是什么?
def request
request ||= Typhoeus::Request.new("www.example.com")
request.on_complete do |response|
if response.success?
xml = Nokogiri::XML(response.body)
else
# retry to download it
end
end
end
答案 0 :(得分:-1)
我认为您需要重构代码。你应该至少有两个队列和线程。
第一个是您通过Typhoeus::Request
来读取的网址队列。
如果队列为空,则将该线程休眠一分钟,然后查找要检索的URL。如果您成功读取了该页面,请对其进行解析并将生成的XML文档推送到DOM的第二个队列中进行处理。处理来自第二个线程。并且,如果第二个队列为空,则睡眠第二个线程,直到有东西可以处理。
如果读取URL失败,则自动将其重新推送到第一个队列。
如果两个队列都是空的,你可以退出代码,或让两个线程都休眠,直到某些东西说再次开始处理URL并重新填充第一个队列。
您还需要与URL关联的重试计数器,否则如果网站出现故障,您可以永久重试。您可以将小子阵列推送到队列中:
["url", 0]
其中0
是重试,或使用对象或定义类变得更复杂。无论你做什么,都要递增该计数器,直到达到掉落值,然后停止将其添加到队列中并以某种方式将其报告或从URL源数据库中删除。
这有点类似于我写过几次处理大型蜘蛛任务的代码。
有关此示例,请参阅Ruby的Thread和Queue类。
此外:
request ||= Typhoeus::Request.new("www.example.com")
毫无意义。该代码运行时request
将为零,因此||=
将始终触发。而是使用:
request = Typhoeus::Request.new("www.example.com")
使用适当的代码进行修改,以从上面提到的第一个队列中提取下一个值。