您可以这样做来为一个请求而不是整个 HTTP 模块设置超时:
local socket = require "socket"
local http = require "socket.http"
response = http.request{url=URL, create=function()
local req_sock = socket.tcp()
req_sock:settimeout(5)
return req_sock
end}
请注意,:settimeout 的默认行为以及像 http.TIMEOUT 这样的全局设置会为请求中的任何单个操作设置时间限制 - 换句话说,它是多长时间操作可能会在超时之前在没有任何活动的情况下进行。如果您希望在操作上设置 总体上限 - 总体请求不能超过的时间,无论活动如何 - 您应该传递一个模式参数 @ 987654327@ 作为:settimeout 的第二个参数,像这样:
local socket = require "socket"
local http = require "socket.http"
response = http.request{url=URL, create=function()
local req_sock = socket.tcp()
-- note the second parameter here
req_sock:settimeout(5, 't')
return req_sock
end}
作为一个示例来说明这两种模式之间的区别,想象一下,在发出您的请求后,服务器每秒响应一次响应块,总共需要 7 秒才能完成。在 req_sock:settimeout(5, 'b')(或只是 req_sock:settimeout(5))设置 5 秒 block 超时的情况下,此请求将正常进行,因为没有 基础 I/O 操作超过 5 秒:但是,req_sock:settimeout(5, 't') 设置了 5 秒 total 超时,请求将在 5 秒后失败。
当然,为这些持续时间两个设置限制可能是有意义的,同时具有较短的不活动超时以及较长的总体 em> 超时。因此,per the documentation,您可以进行两个单独的调用来指定 both:
local socket = require "socket"
local http = require "socket.http"
response = http.request{url=URL, create=function()
local req_sock = socket.tcp()
req_sock:settimeout(5, 'b')
req_sock:settimeout(30, 't')
return req_sock
end}