【问题标题】:Tornado curl_httpclient 'reset' connectionTornado curl_httpclient“重置”连接
【发布时间】:2014-02-01 15:08:55
【问题描述】:

我有一个 tornado 应用程序,它使用 curl_httpclient 向 http 服务器发出请求。每隔一段时间,对服务器的所有调用都会返回不正确的结果。也就是说,http 响应还是可以的,但是服务器返回的内容却不正确。

我发现我可以通过终止并重新启动我的进程来解决这个问题,这似乎意味着如果我与服务器建立新的 TCP 连接并发送新请求,一切都会好起来的。

现在我的问题是如何通过新的 TCP 连接发出 HTTP 请求。我试图用如下所示的新客户端替换 http 客户端,但似乎没有建立新的 TCP 连接并且重用了旧连接。

http_client = tornado.httpclient.AsyncHTTPClient()

如何关闭我现有的 TCP 连接并与服务器建立新连接并继续业务?

【问题讨论】:

    标签: python tornado


    【解决方案1】:

    您可以将 force_instance=True 关键字参数传递给 AsyncHTTPClient 构造函数,以确保您获得一个新对象而不是重用旧对象,但可能值得首先弄清楚为什么您会得到“不正确”的结果.

    结果如何“不正确”?这不是格式良好的 HTTP 响应吗?它是对同一连接上早期(或后续管道)请求的响应,还是不相关的响应?

    确保您使用的是最新版本的 libcurl - 非常旧的版本有异步接口问题的历史,尽管几年来我没有发现任何问题。请注意,如果您使用的是像 centos 这样的缓慢发行版,这可能意味着从源代码安装 libcurl,而不是从您的发行版中获取它。如果你对 curl_httpclient 没有特别的需求,你也可以使用 tornado 的 simple_httpclient。

    【讨论】:

    • 响应是格式良好的 HTTP 响应,应用程序级格式也正确。但是它有错误的内容。我认为问题出在 Web 服务器应用程序上。它可能会不时进入竞争状态,并且不会“看到”新的更新。我正在使用 force_instance=True 参数,它现在创建了一个新实例,但它似乎仍在使用相同的 TCP 连接。有什么方法可以确保新实例创建新的 TCP 连接?
    • 嗯,使用 force_instance 创建的客户端不应与前一个客户端共享任何内容。您确定它与重用的 TCP 连接有关吗?正如我之前所说;目前只有 curl_httpclient 重用 TCP 连接;如果你使用 simple_httpclient 它总是会创建一个新的连接(至少在 Tornado 3.2 中;连接重用应该在未来的版本中出现)
    猜你喜欢
    • 2016-03-26
    • 2012-05-24
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多