我认为你需要重构你的代码。您至少应该有两个正在使用的队列和线程。
第一个是您从中拉出并通过读取的 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")
使用适当的代码进行修改以从上述第一个队列中提取下一个值。