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"}
後面存另一批數據的時候,沒有數據丟失