解决requests.get/post报错Failed to establish a new connection: [WinError 10060]

1 完整报错代码

url,url,"HTTPConnectionPool(host='47.121.2.122', port=8718): Max retries exceeded with url: /project/tender/sync (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x0000016C5C5EB9E8>: Failed to establish a new connection: [WinError 10060] �������ӷ���һ��ʱ���û����ȷ�𸴻����ӵ�����û�з�Ӧ�����ӳ���ʧ�ܡ�'))",2020-06-18 14:38:49

在这里插入图片描述

2 报错分析

  报错情景是采用多线程,设置好了请求头后,往某个api丢入大量数据,40w条数据,存储过程中大概漏了6,700条。一开始我以为是后台吃不消,于是看了后台日志,发现后台并没有相关的报错代码,所以断定报错只是发生在本地,且代码中的错误也提示了与目标ip建立连接失败,所以…
  报这个错误的最容易发现的原因之一是 路由错误,但是此处路由是没有问题的,所以这个错误可以先排除;
  从最初的代码入手

headers = {"Content-Type": "application/json",
                       "user-agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36",}
resp = requests.post(url="略过",
                                headers=headers,
                                data=json.dumps(dict(item)),
                                )

  每请求一次,发起一个请求连接,占用一定的连接资源,在多线程的情况下,短时间内发起请求过多,若不能及时断开且释放相应资源,HTTPConnectionPool中资源不够,其他连接就可能无法建立,导致数据丢失。

3 解决办法

  在请求头中加入"Connection": “close”
即:

    headers = {"Content-Type": "application/json",
                       "user-agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36",
                       "Connection": "close"}

后面存另一批数据的时候,没有数据丢失

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章