如何运行具有特定持续时间的函数? [复制]

Posted

技术标签:

【中文标题】如何运行具有特定持续时间的函数? [复制]【英文标题】:How can I run a function with a specific duration of time? [duplicate] 【发布时间】:2021-08-23 10:58:09 【问题描述】:

我是 python 新手,想知道如何设置函数运行的特定时间。

考虑到这里我有一个名为 df 的包含 891 行的数据框,它的列名 body_text 我想通过一行数据帧并将它们存储到一个名为 df_summary 的新数据帧中。在这里,我的目标是设置一个函数 summary 最多运行 2 分钟,如果它可以在 2 分钟之前完成并进入下一次迭代,那就太好了。如果不是,我想调用另一个函数名称 preprocess 而不是无法在 120 秒内完成的函数 summary

假设我们已经创建了具有 891 行和列名 body_textdf_summary。这是我的代码+一些伪代码,因为我不知道如何准确地编写它:

import time 

for i in tqdm(range(0,891)):
  # code to detect running time here
    df_summary['body_text'][i] = summary(df['body_text'][i])# perform the summary function with at most 120s 
  # when 120s is over but the summary function cannot finish than perform a preprocessing function instead and move to the next iteration
    df_summary['body_text'][i] = preprocess(df['body_text'][i])

请注意,如果函数摘要最多可以运行 120 秒或低于该限制时间,则它不会运行回退函数 preproces,然后移动到下一次迭代。

我怎样才能做到这一点?任何帮助将不胜感激。

【问题讨论】:

不是100%对应我的情况。 缺少多少 %? 我没有看到他们调用了回退函数...你能提出一个与我的情况相对应的解决方案吗? 我建议使用我已链接的问题中显示的解决方案之一,并在顶部添加用于调用后备函数的代码。 其实可以在异常情况下添加回退功能?我听不懂他们的代码... 【参考方案1】:

这是我的答案:

import sys
import threading
try:
    import thread
except ImportError:
    import _thread as thread


def exit_after(s):
    '''
    use as decorator to exit process if 
    function takes longer than s seconds
    '''

    def quit_function(fn_name):
        # print to stderr, unbuffered in Python 2.
        sys.stderr.flush() # Python 3 stderr is likely buffered.
        thread.interrupt_main() # raises KeyboardInterrupt

    def outer(fn):
        def inner(*args, **kwargs):
            timer = threading.Timer(s, quit_function, args=[fn.__name__])
            timer.start()
            try:
                result = fn(*args, **kwargs)
            finally:
                timer.cancel()
            return result
        return inner
    return outer

# I DIDN'Y WRITE THE CODE ABOVE I GOT IT FROM THERE : https://***.com/questions/492519/timeout-on-a-function-call

@exit_after(120) # the function will kill itself after 120 seconds
def process(data): 
    summary(data)

for i in tqdm(range(0,891)):
    try:
        df_summary['body_text'][i] = process(df['body_text'][i])
    except KeyboardInterrupt: # took over 120 seconds
        df_summary['body_text'][i] = preprocess(df['body_text'][i])

120s 后停止处理,运行预处理功能。 有什么不懂的告诉我

【讨论】:

我一直运行到第 45 次迭代我得到了这个错误:KeyError: 45 The above exception was the direct cause of the following exception: KeyError Traceback (most recent call last) 3 frames /usr/local/lib/python3.7/dist-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance) 2898 return self._engine.get_loc(casted_key) 2899 except KeyError as err: -> 2900 raise KeyError(key) from err 2901 2902 if tolerance is not None: KeyError: 45你能检查一下吗? 我不认为这来自我的代码 我测试了迭代 46 很好,但我不确定是什么导致了这个问题...... 它必须来自您的流程函数或其他东西,因为错误涉及一个名为“base.py”的文件 无论如何,如果它来自我的代码,我无能为力,因为我只是复制了其他人的代码并对其进行了调整以与您的代码一起使用

以上是关于如何运行具有特定持续时间的函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何从命令行调用文件中的特定 python 函数? [复制]

如何通过名称动态调用对象上的函数? [复制]

如何使特定平台可以访问功能? [复制]

vector 如何在特定位置调用复制构造函数?

如何允许python文件导出以后可以导入的特定函数? [复制]

如何使用scala将特定函数转换为apache spark中的udf函数? [复制]