1

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

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 分钟后超时。

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

4

1 回答 1

1

err "Connection reset by peer",又名ECONNRESET,意味着服务器——或者你和服务器之间的某个路由器或代理——强行关闭了连接。

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

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

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

于 2013-10-25T21:56:29.720 回答