为什么在将数据上传到我的数据库时经常看到"重置掉连接"?

And*_*son 33 python connection-pooling http urllib3 python-requests

我将数以亿计的项目通过REST API从Heroku上的云服务器上传到我的数据库到AWS EC2中的数据库.我正在使用Python,我不断在日志中看到以下INFO日志消息.

[requests.packages.urllib3.connectionpool] [INFO] Resetting dropped connection: <hostname>
Run Code Online (Sandbox Code Playgroud)

在我的代码继续执行之前,这种"重置丢弃的连接"似乎需要很多秒(有时30秒以上).

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

谢谢你的帮助.安德鲁.

lai*_*e9m 13

请求Keep-Alive默认使用.Resetting dropped connection从我的理解,意味着一个应该活着的连接以某种方式被删除.可能的原因是:

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

有关详细信息,请参阅/sf/answers/1766796321/.


Cam*_*err 11

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

这不一定是因为服务器不支持keepalive,但可能是服务器配置为仅允许连接上的特定数量的请求.这样做可以帮助在不同的服务器上分散请求,但我认为这种做法是常见的,可以防止在服务器中运行的编写糟糕的代码(例如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)
Run Code Online (Sandbox Code Playgroud)


小智 5

对于公开RESTful API以避免滥用(或DoS)的服务,这是常见的做法。
如果您强调他们的API,他们会断开您的连接。
尝试让您的脚本每隔一段时间睡一下,以免丢失。