2013-10-25 89 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秒。这可能会或可能不会工作,具体取决于哪些组件挂起。