从python发出HTTP请求并等待很长时间以获得响应

时间:2013-10-25 20:30:16

标签: python http socket-timeout-exception pyelasticsearch

我正在使用Python来访问有时需要很长时间才能运行的REST API(超过5分钟)。我正在使用pyelasticsearch发出请求,并尝试将超时设置为10分钟,如下所示:

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

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

5分钟后(不是10分钟)它会超时

我尝试设置套接字超时并直接使用请求:

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

每次约5分钟后它会超时。

如何让我的脚本等待更长时间,直到请求返回?

1 个答案:

答案 0 :(得分:1)

错误“通过对等方重置连接”,又名ECONNRESET,意味着服务器 - 或您与服务器之间的某个路由器或代理 - 强行关闭连接。

因此,在您的结尾指定更长的超时不会有任何区别。您需要确定谁正在关闭连接并将其配置为等待更长时间。

可见的地方是服务器应用程序本身,无论服务器程序驱动该应用程序(例如,如果您使用Apache与mod_wsgi,Apache),负载平衡路由器或前端服务器或反向代理服务器前面该服务器或客户端前的Web代理。

一旦你弄清楚问题出在哪里,如果它是你自己无法修复的东西,你可以通过从服务器到客户端的涓涓细流来修复它 - 让它发送一些无用但无害的东西(HTTP 100,一个额外的标题,一些正文文本,客户端知道如何跳过,无论如何,每120秒。这可能会也可能不会起作用,具体取决于挂起的组件。