2013-10-25 107 views
1

我使用Python來訪問REST API,有時需要很長時間才能運行(超過5分鐘)。我使用pyelasticsearch發出請求,並嘗試設置超時時間爲10分鐘是這樣的:從python發出HTTP請求,並等待很長時間回覆

es = ElasticSearch(config["es_server_url"], timeout=600) 
results = es.send_request("POST", 
         [config["es_index"], "_search_with_clusters" ], 
         cluster_query) 

但5分鐘(不是10)requests.exceptions.ConnectionError (Caused by <class 'socket.error'>: [Errno 104] Connection reset by peer)

它超時後我嘗試設置插座超時以及直接使用請求:

socket.setdefaulttimeout(600) 
try: 
    r = requests.post(url, data=post, timeout=600) 
except: 
    print "timed out" 

並且每次約5分鐘後超時。

如何讓我的腳本等待更長時間直到請求返回?

+2

這個錯誤意味着服務器關閉了你的套接字,所以你在你的末尾指定一個更長的超時時間不會有幫助。 (這也可能意味着您真正與之通話的企業網絡代理服務器超時,或者中間的一些路由器已決定切斷您的電話,但是您的代碼無法超時)。服務器代碼或其他人的? – abarnert

+0

是的,它是我的服務器。謝謝你的提示。我試着將請求直接發送到實際的服務器名稱:端口,並在8.5分鐘後成功。 BigIP在5分鐘後關閉連接。 – kielni

回答

1

錯誤「由對等方重置連接」,也就是ECONNRESET,意味着服務器(或者您和服務器之間的某個路由器或代理服務器)強行關閉了連接。

因此,在您的末端指定更長的超時時間不會產生任何影響。您需要確定誰正在關閉連接並將其配置爲等待更長時間。

看起來很合理的地方是服務器應用程序本身,無論服務器程序如何驅動該應用程序(例如,如果您使用Apache與mod_wsgi,Apache),負載平衡路由器或前端服務器或前面的反向代理的服務器,或者客戶端前面的Web代理。

一旦你找出問題出在哪裏,如果你不能解決問題,你可以通過從服務器到客戶端的方式修復它 - 讓它發送一些無用但無害的東西(一個HTTP 100 ,額外的標題,客戶知道如何跳過的一些正文文本,無論如何)每隔120秒。這可能會或可能不會工作,具體取決於哪些組件掛起。