如果失败,Typhoeus会重试

时间:2013-09-05 14:29:19

标签: ruby typhoeus

目前,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

1 个答案:

答案 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")

使用适当的代码进行修改,以从上面提到的第一个队列中提取下一个值。