【问题标题】:Random "[Errno -2] Name or service not known" errors随机“[Errno -2] 名称或服务未知”错误
【发布时间】:2013-12-14 10:07:48
【问题描述】:

我正在使用第三方服务填充本地数据库。我有一个网址列表(大约 500 个)。我在循环中调用每个 url,并使用返回的数据更新我的数据库。代码流程如下:

for url in urllist:
    req = urllib.urlopen(url)
    data = json.loads(req.read())
    req.close()

    #update the db using data here

每当我运行这段代码时,脚本都会随机失败,并显示错误消息“名称或服务未知”。这与 url 没有任何关系,因为脚本在随机点失败(即在一次运行中第 50 次迭代,在另一次运行中第 60 次迭代)

这可能是什么原因?

【问题讨论】:

  • 我想我会将这些调用中的每一个都放入它们自己的线程中。我想,如果您遇到可变错误,那是由于您的网络在不同时间出现拥塞。
  • 检查您的代理或防火墙
  • 这些请求同步工作,我在开始下一个请求之前关闭每个请求。这仍然与网络拥塞有关吗?

标签: python django networking urllib


【解决方案1】:

如果您使用了错误的代理或存在网络问题,您可以试试这个:

for url in urllist:
    retry = 0
    while True: # retry request
        try:
            req = urllib.urlopen(url)
            resp_data = req.read() # in call read() network still processing
        except Exception as e: # TODO need more detailed handling
            if retry > 3: # 3 this is serious problem. exit
                raise e
            retry += 1 # retry
        else:
            data = json.loads()
            req.close() # not needed
            break

【讨论】:

  • 是的,我可以试试这个,但我想找到问题的原因并解决它。知道如何查看它是否与代理相关或其他?
  • 如果您使用不受信任的代理,您可能会收到许多不同的错误并且无法修复它们。我也有类似的经历。我得到 30% 的错误是 5 种不同的类型。
  • 作为 hack,您可以在请求之间添加 1-3 秒的暂停
  • 这种方法似乎奏效了。我宁愿尝试找到问题的原始根源,但在此之前这一切都会好起来的。谢谢
猜你喜欢
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多