pycom urequests超时未按预期工作

时间:2019-06-23 12:54:38

标签: sockets micropython

标准Pycom urequests库(下面的一部分)不支持用户可配置的超时。

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])

如果我要联系的服务器没有响应,代码将等待

ai = usocket.getaddrinfo(host, port)

30秒钟,然后退出并显示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秒钟,然后才返回数据,而以前我会在服务器响应的那一刻获取数据。

我认为30s超时必须可以在我根本无法确定的地方访问。我在这里有点头疼。谁能提供一些建议?

0 个答案:

没有答案
相关问题