Python requests.get被卡住。

9
我正在编写一段Python代码,用来每2秒从局域网中的一个简单服务器读取温度。但问题是有时候脚本会卡住不执行任何操作。我使用的是Python 3.6在Windows上,并且使用了requests库。
import requests
import time

while True:
    s=time.time()

    r = requests.get("http://192.168.1.2/readtemp.php?id=1&action=read")
    temp = r.text
    print (temp + ' - ' + str(time.time()-s) + ' Seconds')
    time.sleep(2)

我得到的回应如下:

29°C - 0.272745847702026 秒

29°C - 0.64812617301941 秒

29°C - 0.294319868087769 秒

但是有时候当我回到电脑前时,发现它一直卡在那里不动,有什么原因导致它会被卡住,难道不应该像浏览器一样持续请求直到收到响应吗?

服务器是否仍然响应浏览器请求?您使用什么来运行服务器进程?看起来更像是服务器卡住了,而不是客户端的问题。 - holdenweb
5
使用timeout参数,然后您可以捕获Timeout异常 - http://docs.python-requests.org/en/master/user/quickstart/#timeouts - Robert Seaman
@holdenweb 是的,它仍然响应浏览器请求。 - M. Serseg
@RobertSeaman 我会尝试解决这个问题,但我很困惑为什么它会超时,当它应该正常运行。我正在使用wamp服务器,我没有在.net中遇到过这个问题,有没有办法知道Python函数卡在哪里了? - M. Serseg
默认情况下,requests不会重试也没有超时,因为使用超时会通知您可能存在的问题(在我看来最有可能的问题)。您可以捕获异常并稍后重试,或者选择更高级的重试适配器路线。http://www.coglib.com/~icordasc/blog/2014/12/retries-in-requests.html - Tobias
1个回答

11

正如Tobias所写,requests默认情况下既不会重试也没有超时设置,因为使用超时设置可以让您了解潜在(而且最有可能的,在我看来)的问题。要么捕获异常并稍后重试,要么可以采用更高级的重试适配器方法。

尝试使用超时和错误处理的请求:

import requests
import time

while True:
    s=time.time()

    try: 
        r = requests.get("http://192.168.1.2/readtemp.php?id=1&action=read", timeout=10)
    except requests.exceptions.Timeout as err: 
        print(err)
        # sleep some sec/min and retry here!

    temp = r.text
    print (temp + ' - ' + str(time.time()-s) + ' Seconds')

    time.sleep(2)

1
解释为什么它会解决手头的问题,以及作者在哪里出错了。 - Coder
问题的评论中已经解释了,我将其复制到答案中了。 - DaWe
1
很多来这里寻求帮助的人并不会仔细阅读评论。因此,如果您能在回答中添加这些内容,那将非常有帮助。 - Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接