Python请求有时会冻结

时间:2016-02-09 12:27:35

标签: python multithreading python-requests long-polling

我有一个Python程序,它通过请求包为每个轮询使用不同的线程并行发送几个(大约5-6个)长轮询请求。我意识到我的一些线程有时会冻结。发生这种情况时,我发送请求的服务器不会收到请求。此外,我在请求上设置了超时,但它不起作用。

try:
    print("This line prints")
    response = requests.head(poll_request_url, timeout=180)
    print("This line does not print when freeze occurs")
except ReadTimeout:
    print("Request exception.")
except RequestException as e:
    print("Request exception.")
except Exception:
    print("Unknown exception.")
print("This line does not print either when freeze occurs.")

我在使用Raspbian OS的Raspberry Pi 2硬件上执行此操作。

当我使用Python 2.7时,我使用了同样的程序而没有任何问题。最近我切换到Python 3.5。我使用2.8.1和2.9.1的两个请求版本进行了测试。

这个问题不会经常发生,但每天在不同的线程上发生2-3次。

可能是什么问题?我该怎么调试呢?

编辑:通过更新Linux内核解决了这个问题。

2 个答案:

答案 0 :(得分:5)

根据文件:

http://docs.python-requests.org/en/master/user/quickstart/#timeouts

超时发生时应抛出Timeout异常。这意味着这一行:

print("This line does not print when freeze occurs")

永远不会被称为超时实际发生。

你是否正在捕捉异常?还是其他任何例外?这可能是它的时机不错,但你还没有看到这一点。也许尝试这样的事情:

try:
    response = requests.head(poll_request_url, timeout=180)
except requests.exceptions.Timeout:
    print("Timeout occurred")

所以你可以看看是否发生了什么。

编辑:可能它是"连接"没有正确计时的步骤。它可能是" connect"的超时值。步骤搞砸了。也许尝试更短的超时(如这里提到的):

http://docs.python-requests.org/en/master/user/advanced/#timeouts

e.g。

response = requests.head(poll_request_url, timeout=(3, 180))

是否可能出现某种DNS查询问题?也许看看硬编码IP是否存在同样的问题?

答案 1 :(得分:1)

使用计时器(来自线程导入计时器)解决了我的问题。如果未来10秒没有结果 - 重复,如果接下来10秒没有结果 - 打印'错误'然后继续如果请求冻结,您无法使用if语句监视计时器状态,但您可以通过while循环执行此操作,如果结果正常则添加时间(Python: Run code every n seconds and restart timer on condition)。