Вы можете сделать это, чтобы установить таймаут для одного запроса вместо всего модуля 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
, устанавливают ограничение времени для каждой отдельной операции в запросе - другими словами, это продолжительность операции. может пройти без активности до истечения времени ожидания. Если вы хотите установить общую верхнюю границу для операции - время, которое общий запрос не может превышать, независимо от активности - вы должны передать аргумент режима 't'
в качестве второго параметра для :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}
В качестве примера, чтобы проиллюстрировать различие между двумя режимами, представьте, что после выполнения вашего запроса сервер отвечал фрагментом ответа один раз в секунду, и для его завершения потребовалось всего семь секунд. Если req_sock:settimeout(5, 'b')
(или просто req_sock:settimeout(5)
) установить 5-секундный блок тайм-аут, этот запрос будет выполняться нормально, так как ни одна из базовых операций ввода-вывода не заняла больше времени, чем пять секунд: однако, если req_sock:settimeout(5, 't')
установить пятисекундный общий тайм-аут, запрос завершится неудачей через пять секунд.
Конечно, может иметь смысл установить ограничения для для обеих этих длительностей, имеющих как короткий неактивный тайм-аут, так и более длительный общий тайм-аут , Таким образом, согласно документации , вы можете сделать два отдельных вызова, чтобы указать оба :
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}