python线程中的Bug

2024-09-29 01:20:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些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计算机是只读的,计算机继续正常工作和运行。我的问题就在这条线上。我想他们可能得不到回应,这条线可能就是问题所在

^{pr2}$

我不知道如何解决这个问题,任何帮助或建议将不胜感激。在

谢谢你


Tags: 文件代码iftime计算机pisleep线程
3条回答

一个空的^{} 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)

然后,当您遇到异常时,您将得到一个日志:

^{pr2}$

您的代码也可能挂在^{}或{a3}上。您可以添加额外的日志来解决您遇到的问题,尽管您已经看到它会重新启动,但我怀疑它是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

因为有了答案,我才想出了一个解决办法。我意识到请求有一个内置的超时功能。如果未将超时指定为参数,则不会发生超时。
我的解决方案是:

resp = requests.post(url+'c', json=payload, timeout=45)

You can tell Requests to stop waiting for a response after a given number of seconds with the timeout parameter. Nearly all production code should use this parameter in nearly all requests. Failure to do so can cause your program to hang indefinitely

临时沃尔夫和其他人提供的答案对我帮助很大。谢谢你的帮助。在

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

对于您所看到的行为,我能想到的唯一原因是,在checkInCount达到50之后,sudo reboot会引发一个异常,然后被程序忽略,使这个线程陷入无限循环。在

如果您想知道实际发生了什么,请将print或{}语句添加到代码的所有不同分支中。在

或者,删除blanket try except子句或将其替换为特定的内容,例如except requests.exceptions.RequestException

相关问题 更多 >