这是限制函数可以执行时间的更好方法



我使用 django 构建了一个工具来自动化脚本执行。该工具工作正常,但有时脚本执行时间太长。我想限制我的工具可以执行每个脚本的时间。我找到了 2 种方法并实施了它们,但我不确定哪种方法是正确的。

1.( 使用信号模块
2.( 使用多处理

以下是两种方法的示例代码

1.( 使用信号模块

import signal
from contextlib import contextmanager
class TimeoutException(Exception): pass
@contextmanager
def time_limit(seconds):
    def signal_handler(signum, frame):
        raise TimeoutException("Timed out!")
    signal.signal(signal.SIGALRM, signal_handler)
    signal.alarm(seconds)
    try:
        yield
    finally:
        signal.alarm(0)
try:
    with time_limit(10):
        long_function_call()
except TimeoutException as e:
    print("Timed out!")

2.( 使用多处理

from multiprocessing import Process
from time import sleep
def f(time):
    sleep(time)
def run_with_limited_time(func, args, kwargs, time):
    p = Process(target=func, args=args, kwargs=kwargs)
    p.start()
    p.join(time)
    if p.is_alive():
        p.terminate()
        return False
    return True
if __name__ == '__main__':
    print run_with_limited_time(f, (1.5, ), {}, 2.5) # True
    print run_with_limited_time(f, (3.5, ), {}, 2.5) # False

信号模块面临的问题是信号只在主线程中工作。想知道哪种方法更好,为什么?此外,如果有任何方法,我可以用来改变信号模块的行为。

基于信号的方法有几个极端情况和限制。它不是可移植的,信号只能在主线程上处理,如果你的应用程序在低级循环中忙碌(因为它正在调用一些 C api(,你的应用程序将变得无响应。

我推荐基于 multiprocessing 的方法,因为它克服了上述所有限制,并且有一个主要好处:它可以保护您的服务免受您在函数中运行的逻辑导致的崩溃、超时和不稳定的影响。

很少有图书馆可以帮助我,鹅卵石和台球是我想到的。

相关内容

  • 没有找到相关文章