Я использую заимствованный скрипт Python, который имеет два определения функций (get_data
и get_data_multiple
) внутри класса, определенного за пределами main function
. Функция main
вызывает get_data_multiple
, что, в свою очередь, вызывает get_data
. Короче говоря, мой код выбирает Pi Data с помощью модуля win32com (from win32com.client.dynamic import Dispatch
).
Цель состоит в том, чтобы запускать функцию main
каждый час. Я делаю это, используя цикл while True:
и модуль time.time()
из time
. В некоторых редких случаях я считаю, что вызов get_data
занимает слишком много времени, чтобы отправить возвращаемое значение на get_data_multiple
. В этих случаях мой код дает сбой, поскольку к тому времени возвращается значение main
, уже прошло час.
Я хочу добавить логику, в которой я прекращаю вызов на get_data
и заставляю его возвращать значение по умолчанию, если время, проведенное в нем, превысило определенное время. Я знаю, что функция проводит слишком много времени в строке pi_values = tag.Data.InterpolatedValues2(t_start, t_end, t_interval, asynchStatus=None)
. Как я могу это сделать, если у меня нет возвращаемого значения из функции?
def get_data(self, tag_name, t_start, t_end, t_interval):
"""Retrieve interpolated data from the PI-server
Args:
tag_name (str): PI tag name
t_start (str): PI time format (ex. '*-72h')
t_end (str): PI time format (ex. '*')
t_interval (str): PI time format (ex. '1h')
Returns:
pandas dataframe: index=datetime, col_1=interpolated values
"""
logger.info('get_data for tag `%s`' % tag_name)
tag = self.pi_srv.PIPoints(tag_name)
pi_values = tag.Data.InterpolatedValues2(t_start, t_end, t_interval, asynchStatus=None)
return (self.pivalues_to_df(pi_values, tag_name))
def get_data_multiple(self, tags, t_start, t_end, t_interval):
"""Retrieve interpolated data from the PI-server for multiple tags
Args:
tags (list): List of PI tag names
t_start (str): PI time format (ex. '*-72h')
t_end (str): PI time format (ex. '*')
t_interval (str): PI time format (ex. '1h')
Returns:
pandas dataframe: index=datetime, cols=interpolated values
"""
logger.info('getting data for %s tags' % len(tags))
list_of_values = []
pBar = ProgressBar()
for i,tag in enumerate(tags):
print(i)
df = None
while df is None:
try:
df = self.get_data(tag, t_start, t_end, t_interval)
except:
print('Connection Timeout. Retring.....')
pass
# drop duplicated indices -> result of summer-to-winter time
# transition. Not doing this results in the subsequent join() to
# spiral out of control
df = df[~df.index.duplicated()]
list_of_values.append(df)
df_values = pd.DataFrame().join(list_of_values, how='outer')
#print(df_values.columns)
return df_values