【发布时间】: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