【问题标题】:make HTTP request from python and wait a long time for a response从 python 发出 HTTP 请求并等待很长时间才能得到响应
【发布时间】:2013-10-25 20:30:16
【问题描述】:

我正在使用 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 分钟后超时。

如何让我的脚本在请求返回之前等待更长的时间?

【问题讨论】:

  • 该错误意味着服务器关闭了您的套接字,因此您指定更长的超时时间并没有帮助。 (这也可能意味着您真正与之交谈的公司 Web 代理有超时,或者中间的某个路由器决定切断您的连接。但它不可能是您的代码超时。)服务你的代码,还是其他人的?
  • 是的,这是我的服务器。谢谢你的提示。我尝试直接向实际服务器名称:端口发出请求,并在 8.5 分钟后成功。是 BigIP 在 5 分钟后关闭连接。

标签: python http socket-timeout-exception pyelasticsearch


【解决方案1】:

错误“Connection reset by peer”,又名ECONNRESET,表示服务器——或者你和服务器之间的某个路由器或代理——强行关闭了连接。

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

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

一旦确定问题出在哪里,如果是您自己无法解决的问题,您可以通过从服务器向客户端发送一些无用但无害的信息(HTTP 100,一个额外的标题,一些你的客户知道如何跳过的正文文本,无论如何)每 120 秒。这可能有效,也可能无效,具体取决于挂起的组件。

【讨论】:

    猜你喜欢
    • 2016-11-07
    • 2020-10-17
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多