Как завершить функцию Python, когда функция не доступна - PullRequest
0 голосов
/ 11 ноября 2019

Я использую заимствованный скрипт 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

1 Ответ

0 голосов
/ 11 ноября 2019

Вы можете попробовать это:

import signal

def signal_handler(signum, frame):
    raise Exception("Timed out!")

и в своем коде:

signal.signal(signal.SIGALRM, signal_handler)
signal.alarm(10)   # Ten seconds
try:
   pi_values = tag.Data.InterpolatedValues2(t_start, t_end, t_interval, asynchStatus=None)
except:
    print "Timed out!"

и установить значение по умолчанию для pi_values ​​в условии исключений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...