gpt4 book ai didi

python - 哪种方法可以更好地限制函数的执行时间?

转载 作者:太空宇宙 更新时间:2023-11-03 11:13:45 25 4
gpt4 key购买 nike

我已经使用 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 的方法,因为它克服了上述所有限制并且有一个主要好处:它可以保护您的服务免受崩溃、超时和源自您在函数中运行的逻辑的不稳定。

很少有库可以帮助解决这个问题,pebblebilliard是我想到的。

关于python - 哪种方法可以更好地限制函数的执行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55721657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com