当函数无法返回时如何终止Python函数

我使用的是借用的Python脚本,该脚本在get_data外部定义的类中有两个函数定义(get_data_multiplemain function)。 main函数调用get_data_multiple,后者依次调用get_data。简而言之,我的代码使用win32com模块(from win32com.client.dynamic import Dispatch)获取Pi数据。

目标是每小时运行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_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,asynchStatus=None)
        return (self.pivalues_to_df(pi_values,tag_name))

def get_data_multiple(self,tags,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_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
shengsheng321 回答:当函数无法返回时如何终止Python函数

您可以尝试以下方法:

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!"

并在except子句中为pi_values设置默认值

本文链接:https://www.f2er.com/3126451.html

大家都在问