我有一些raspberry pi
运行了一些python
代码。有一段时间我的设备将无法检入。其余的python代码继续完美运行但这里的代码退出。我不知道为什么?如果设备无法办理登机手续,则应重新启动,但他们不会重启。 python
文件中的其他线程继续正常运行。
class reportStatus(Thread):
def run(self):
checkInCount = 0
while 1:
try:
if checkInCount < 50:
payload = {'d':device,'k':cKey}
resp = requests.post(url+'c', json=payload)
if resp.status_code == 200:
checkInCount = 0
time.sleep(1800) #1800
else:
checkInCount += 1
time.sleep(300) # 2.5 min
else:
os.system("sudo reboot")
except:
try:
checkInCount += 1
time.sleep(300)
except:
pass
这些设备可以运行数天和数周,并且每隔30分钟就能完美检查一次,然后突然停止运行。我的linux
台计算机处于只读状态,计算机可以继续正常运行。我的问题出在这个帖子中。我认为他们可能无法得到答复,这一行可能是问题
resp = requests.post(url+'c', json=payload)
我不知道如何解决这个问题,我们将非常感谢任何帮助或建议。
谢谢
答案 0 :(得分:0)
您的代码基本上忽略了所有异常。这在Python中被认为是一件坏事。
我能够考虑到您所看到的行为的唯一原因是,在checkInCount
达到50之后,sudo reboot
会引发一个异常,然后您的程序会忽略该异常,线程卡在无限循环中。
如果您想查看实际发生的情况,请将print
或loggging.info
语句添加到代码的所有不同分支。
或者,删除毯子try-except子句或将其替换为特定的内容,例如except requests.exceptions.RequestException
答案 1 :(得分:0)
裸except:pass
is a very bad idea。
更好的方法是至少记录任何例外情况:
import traceback
while True:
try:
time.sleep(60)
except:
with open("exceptions.log", "a") as log:
log.write("%s: Exception occurred:\n" % datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
traceback.print_exc(file=log)
然后,当你得到一个例外时,你得到一个日志:
2016-12-20 13:28:55: Exception occurred:
Traceback (most recent call last):
File "./sleepy.py", line 8, in <module>
time.sleep(60)
KeyboardInterrupt
您的代码也可能挂在sudo reboot
或requests.post
上。您可以添加其他日志记录来解决您遇到的问题,但是如果您看到它重新启动,我怀疑它是requests.post
,在这种情况下您需要添加timeout (from the linked answer):
import requests
import eventlet
eventlet.monkey_patch()
#...
resp = None
with eventlet.Timeout(10):
resp = requests.post(url+'c', json=payload)
if resp:
# your code
答案 2 :(得分:0)
由于给出了答案,我能够提出解决方案。我意识到请求有一个内置的超时功能。如果未将超时指定为参数,则永远不会发生超时 这是我的解决方案:
resp = requests.post(url+'c', json=payload, timeout=45)
您可以告诉请求在给定后停止等待响应 timeout参数的秒数。几乎所有的生产 代码应该在几乎所有请求中使用此参数。没有做到 所以会导致程序无限期挂起
TemporalWolf和其他人提供的答案帮助了我很多。感谢所有帮助过的人。