Стандартная библиотека запросов Pycom (часть ниже) не поддерживает настраиваемые пользователем таймауты.
def request(method, url, data=None, json=None, headers={}, stream=None):
try:
proto, dummy, host, path = url.split("/", 3)
except ValueError:
proto, dummy, host = url.split("/", 2)
path = ""
if proto == "http:":
port = 80
elif proto == "https:":
import ussl
port = 443
else:
raise ValueError("Unsupported protocol: " + proto)
if ":" in host:
host, port = host.split(":", 1)
port = int(port)
ai = usocket.getaddrinfo(host, port)
ai = ai[0]
s = usocket.socket(ai[0], ai[1], ai[2])
try:
s.connect(ai[-1])
Если сервер, с которым я пытаюсь связаться, не отвечает, код ждет в течение 30 секунд
ai = usocket.getaddrinfo(host, port)
, а затем завершается с ошибкой OSError.
Так что я изменил его, используя https://github.com/micropython/micropython-lib/pull/263/files в качестве руководства
def request(method, url, data=None, json=None, headers={}, stream=None, timeout=5):
try:
proto, dummy, host, path = url.split("/", 3)
except ValueError:
proto, dummy, host = url.split("/", 2)
path = ""
if proto == "http:":
port = 80
elif proto == "https:":
import ussl
port = 443
else:
raise ValueError("Unsupported protocol: " + proto)
if ":" in host:
host, port = host.split(":", 1)
port = int(port)
ai = usocket.getaddrinfo(host, port)
ai = ai[0]
s = usocket.socket(ai[0], ai[1], ai[2])
if timeout is not None:
assert hasattr(usocket.socket, 'settimeout'), 'Socket does not support timeout'
s.settimeout(timeout)
try:
s.connect(ai[-1])
Это не принесло мне пользы, эта чертова штука все еще ждет 30 секунд, если нет ответа сервера.Во всяком случае, мне хуже, потому что теперь он также ждет 5 секунд после каждого ответа сервера, прежде чем вернуть данные, тогда как раньше я получал данные в тот момент, когда сервер ответил.
Я полагаю, что тайм-аут 30 секунд должен бытьдоступно где-то, я просто не могу понять, где.Я немного над головой здесь.Кто-нибудь может предложить несколько предложений?