我正在做一个长轮询请求设置10秒的超时,但它似乎不工作。我的理解是,如果我们在指定的超时内没有从后端得到响应,后端调用应该以timedout
错误代码结束。是这样吗?
但是如果我使用一个非常小的超时,例如0.001,它可以工作。所以我认为如果一个请求已经发送到后端,超时不起作用。
对于我的长轮询请求,如果我的网络在发送请求并等待响应时关闭,lua套接字挂在那里并且永远不会从这种情况中恢复。如果我能以其他方式处理这件事,你能帮助我吗?
版权所有(C) 1994-2008 Lua.org, pu - rio (double int32)代码小型立式钢琴:
local http = require "socket.http"
local https = require "ssl.https"
http.TIMEOUT = 10
local r,s,h = https.request({
url = url,
method = "GET",
sink = ltn12.sink.table(results),
headers = {
["Cache-Control"] = "no-cache",
["X-Token"] = config.token
}
})
我在获取https连接超时时也遇到了问题。将超时设置为http.TIMEOUT = ...
是正确的做法,即使对于https(当使用非常小的超时时确认)。
在我的案例中,DNS解析是罪魁祸首。这似乎是同步发生的,没有从lua端强制超时,只有当系统调用getaddrinfo
(或任何luasec内部使用)返回时才会超时。
我的一个解决方案是使用IP而不是主机名,以绕过DNS解析。那么暂停对我来说是有效的。另一个可以帮助解决问题的方法是为连接创建一个超时线程。