【问题标题】:tornado.httpclient.HTTPError: HTTP 599: Timeout in request queue issuetornado.httpclient.HTTPError: HTTP 599: Timeout in request queue issue
【发布时间】:2016-11-10 03:43:10
【问题描述】:

我正在使用 Tornado 的异步 http 客户端使用 etcd 创建一个异步屏障库。我想将获取 http 请求的超时更改为大于默认值 20 秒。我使用 request_timeout=120 和 connect_timeout=120 来增加与获取相关的超时。但是,在默认的 20 秒之后,我仍然会得到龙卷风引发异常:

tornado.httpclient.HTTPError: HTTP 599: Timeout in request queue
ERROR:tornado.access:500 GET /a (::1) 22684.49ms

我确实读到了 Ben 在 7 月 2 日提到存在错误的地方:

https://github.com/tornadoweb/tornado/issues/1753

但是我认为增加连接和请求超时可以解决这个问题?这仍然是一个突出的错误吗?因为最新版本是 2016 年 10 月 1 日

【问题讨论】:

  • 您是否正在发送大量并发请求?超时实际上是从请求排队的时间开始的,而不是从它启动的时间开始的。如果SimpleHTTPClient的默认并发级别20不够,你的请求会在等待发送时超时。
  • 嗨 Blender,是的,我同时发送了很多请求,我增加了 max_clients,我认为这是问题的一部分。但我仍然认为 request_timeout 参数没有正常工作。
  • 你能说明你是如何设置超时的吗?队列超时应使用 request_timeout 和 connect_timeout(以较短者为准),因此如果您将两者都设置为 120,则不应在 22 秒后超时。
  • 嗨 Ben,这行代码只是在 HTTPRequest 类中设置 request_timeout: HTTPRequest(url=url+"?wait=true",method="GET",request_timeout=timeout) 我删除了connection_timeout 行。紧随其后的是 fetch:request=await self.httpClient.fetch(waitRequest)。但是,自从我更新了 max_clients 后,它可能不再是问题了。我认为这是我的问题的主要来源。因为我正在执行锁定,所以我将客户端最大化,这导致新的获取等待锁定被释放,而旧的锁无法释放新的获取。
  • 我需要再次检查,但我仍然认为客户端在默认 20 秒后超时,而不是我通过的 request_timeout。难道是max_clients满了request_timeout设置为默认?

标签: tornado


【解决方案1】:

对于SimpleHTTPClient,在请求队列中花费的时间仍然计入超时。您的错误消息就是这样说的:

tornado.httpclient.HTTPError: HTTP 599: Timeout in request queue
                                        ^^^^^^^^^^^^^^^^^^^^^^^^

这是一个有意识的设计选择,因此您可以通过继承 SimpleAsyncHTTPClient 并省略该代码来让 Tornado 不这样做:

from tornado.httpclient import AsyncHTTPClient
from tornado.simple_httpclient import SimpleAsyncHTTPClient
from tornado.log import gen_log

class NoQueueTimeoutHTTPClient(SimpleAsyncHTTPClient):
    def fetch_impl(self, request, callback):
        key = object()

        self.queue.append((key, request, callback))
        self.waiting[key] = (request, callback, None)

        self._process_queue()

        if self.queue:
            gen_log.debug("max_clients limit reached, request queued. %d active, %d queued requests." % (len(self.active), len(self.queue)))


AsyncHTTPClient.configure(NoQueueTimeoutHTTPClient)

【讨论】:

  • 这对我来说似乎是正确的(在 2019 年的 tornado 6.0.3 中它仍然有效),但在我将这样的东西投入生产之前,我想了解这种有意识的设计选择。您知道为什么会出现这种情况吗?
猜你喜欢
  • 2022-12-01
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 2021-09-14
  • 2012-04-17
  • 1970-01-01
  • 2019-06-17
  • 2022-12-01
相关资源
最近更新 更多