2

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

1 回答 1

0

我认为你需要重构你的代码。您至少应该有两个正在使用的队列和线程。

第一个是您从中拉出并通过读取的 URL 队列Typhoeus::Request

如果队列为空,则让该线程休眠一分钟,然后查找要检索的 URL。如果您成功阅读了该页面,请对其进行解析并将生成的 XML 文档推送到第二个 DOM 队列中以进行处理。从第二个线程处理它。并且,如果第二个队列为空,则休眠第二个线程,直到有东西可以处理。

如果读取 URL 失败,自动将其重新推送到第一个队列。

如果两个队列都是空的,你可以退出代码,或者让两个线程休眠,直到有东西说再次开始处理 URL 并且你重新填充第一个队列。

您还需要一个与 URL 关联的重试计数器,否则如果站点出现故障,您可以永远重试。您可以将小子数组推送到队列中,如下所示:

["url", 0]

重试在哪里0,或者使用对象或定义类变得更复杂。不管你做什么,增加那个计数器直到它达到一个死值,然后停止将它添加到队列中并报告它或者以某种方式从你的 URL 数据库源中删除它。

这有点类似于我为处理大型爬虫任务而编写的代码。

有关这方面的示例,请参阅 Ruby 的 Thread 和 Queue 类。

还:

request ||= Typhoeus::Request.new("www.example.com")

没有意义。request该代码运行时将为 nil,因此||=将始终触发。而是使用:

request = Typhoeus::Request.new("www.example.com")

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

于 2013-09-05T15:34:18.550 回答