python线程中的错误

时间:2016-12-16 14:32:41

标签: python multithreading python-requests

我有一些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)

我不知道如何解决这个问题,我们将非常感谢任何帮助或建议。

谢谢

3 个答案:

答案 0 :(得分:0)

您的代码基本上忽略了所有异常。这在Python中被认为是一件坏事。

我能够考虑到您所看到的行为的唯一原因是,在checkInCount达到50之后,sudo reboot会引发一个异常,然后您的程序会忽略该异常,线程卡在无限循环中。

如果您想查看实际发生的情况,请将printloggging.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 rebootrequests.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和其他人提供的答案帮助了我很多。感谢所有帮助过的人。