время ожидания сокета http lua - PullRequest
7 голосов
/ 16 мая 2011

В документации модуля LuaSocket HTTP сказано, что для HTTP-соединения можно установить тайм-аут:

Следующие константы могут быть установлены для управления поведением модуля HTTP по умолчанию:

PORT: порт по умолчанию, используемый для соединений; ПРОКСИ: прокси по умолчанию, используемый для соединений; TIMEOUT: устанавливает время ожидания для всех операций ввода-вывода; USERAGENT: агент пользователя по умолчанию отправляется на сервер. http://w3.impa.br/~diego/software/luasocket/http.htm

Как мне установить эти константы в скрипте lua?

Ответы [ 2 ]

12 голосов
/ 16 мая 2011

Это было проще, чем я думал.просто

local mysocket = require("socket.http")
mysocket.TIMEOUT = 5
6 голосов
/ 16 мая 2011

Вы можете сделать это, чтобы установить таймаут для одного запроса вместо всего модуля 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}
...