解決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"}

後面存另一批數據的時候,沒有數據丟失

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