gpt4 book ai didi

ruby - 如果失败,Typhoeus 会重试

转载 作者:太空宇宙 更新时间:2023-11-03 16:59:20 25 4
gpt4 key购买 nike

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

最佳答案

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

第一个是一个 URL 队列,您可以通过 Typhoeus::Request 从中读取它们。

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

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

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

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

["url", 0]

其中 0 是重试,或者使用对象或定义类变得更复杂。无论您做什么,增加该计数器直到它达到一个 drop-dead 值,然后停止将其添加到队列并报告它或以某种方式将其从您的 URL 源数据库中删除。

这有点类似于我为处理大型抓取任务而编写过几次的代码。

请参阅 Ruby 的 Thread 和 Queue 类以获取相关示例。

还有:

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

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

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

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

关于ruby - 如果失败,Typhoeus 会重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18639055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com