Я опрашиваю данные, используя функцию Python 2.7.10, для которой я хочу установить таймаут, если устройство слишком долго отвечает, или перехватить RuntimeError, если это устройство недоступно.
Я использую эту функцию Timeout:
class Timeout():
class Timeout(Exception):
pass
def __init__(self, sec):
self.sec = sec
def __enter__(self):
signal.signal(signal.SIGALRM, self.raise_timeout)
signal.alarm(self.sec)
def __exit__(self, *args):
signal.alarm(0)
def raise_timeout(self, *args):
raise Timeout.Timeout()
Это мой цикл для опроса данных (Modbus) и определения исключений. Этот цикл вызывается каждые 60 секунд:
def getDeviceTags(name, tag_data):
global val_returns
for tag in tag_data[name]:
local_vals = []
local_vals.append(name+"."+tag)
try:
with Timeout(3):
value = modbus.read(str(name), str(tag))
local_vals.append(str(value.value()))
except RuntimeError:
print("RuntimeError on " + str(name))
local_vals.append(None)
except Timeout.Timeout:
print("Timeout on " + str(name))
local_vals.append(None)
val_returns.append(local_vals)
Это будет работать в течение ДНЕЙ без проблем, как RuntimeErrors и Timeouts печатаются в консоль, все данные записываются - GREAT.
Тем не менее, в последнее время он застрял - и это единственная ошибка, которую я получаю:
Traceback (most recent call last):
File "working_one_min_back.py", line 161, in <module>
job()
File "working_one_min_back.py", line 79, in job
getDeviceTags(str(key), data)
File "working_one_min_back.py", line 57, in getDeviceTags
print("RuntimeError on " + str(name))
File "working_one_min_back.py", line 30, in raise_timeout
raise Timeout.Timeout()
__main__.Timeout