39

我正在通过 REST API 从 Heroku 上的云服务器向 AWS EC2 中的数据库上传数亿个项目到我的数据库。我正在使用 Python,并且经常在日志中看到以下 INFO 日志消息。

[requests.packages.urllib3.connectionpool] [INFO] Resetting dropped connection: <hostname>

在我的代码继续再次执行之前,这种“重置断开的连接”似乎需要很多秒(有时 30 多秒)。

  • 首先,这里到底发生了什么,为什么?
  • 其次,有没有办法阻止连接断开,以便我能够更快地上传数据?

谢谢你的帮助。安德鲁。

4

3 回答 3

15

请求Keep-Alive默认使用. Resetting dropped connection,据我了解,这意味着应该存在的连接以某种方式被丢弃。可能的原因有:

  1. 服务器不支持Keep-Alive
  2. 已建立的连接有一段时间没有数据传输,因此服务器断开连接。

有关更多详细信息,请参阅https://stackoverflow.com/a/25239947/2142577

于 2016-01-23T15:25:52.707 回答
13

问题实际上是服务器已经关闭了连接,即使客户端请求它保持活动状态。

这不一定是因为服务器不支持keepalives,但可能是服务器配置为仅允许连接上的一定数量的请求。这样做可以帮助将请求分散到不同的服务器上,但我认为这种做法是/常见的一种实际防御措施,可以防止在服务器中运行的编写不佳的代码(例如 PHP)在服务后不会自行清理一个请求(可能是由于错误条件等)

如果您认为这是您的情况,并且您不希望看到这些日志(以 INFO 级别记录),那么您可以添加以下内容以消除该部分的日志记录:

# Really don't need to hear about connections being brought up again after server has closed it
logging.getLogger("requests.packages.urllib3.connectionpool").setLevel(logging.WARNING)
于 2016-06-07T11:51:42.397 回答
4

这是公开 RESTful API 以避免滥用(或 DoS)的服务的常见做法。
如果您强调他们的 API,他们会断开您的连接。
试着让你的脚本每隔一段时间就睡一会儿,以避免掉线。

于 2015-03-05T05:52:32.290 回答