我使用 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
的方法,因为它克服了上述所有限制,并且有一个主要好处:它可以保护您的服务免受您在函数中运行的逻辑导致的崩溃、超时和不稳定的影响。
很少有图书馆可以帮助我,鹅卵石和台球是我想到的。