class TimedOutExc(Exception): passdef timeout(timeout): def decorate(f): def handler(signum,frame): raise TimedOutExc() def new_f(*args,**kwargs): old = signal.signal(signal.SIgalRM,handler) signal.alarm(timeout) try: result = f(*args,**kwargs) except TimedOutExc: return None finally: signal.signal(signal.SIgalRM,old) signal.alarm(0) return result new_f.func_name = f.func_name return new_f return decorate
好吧,它可以工作但是当我在多处理函数上使用这个装饰器并且由于超时而停止时,它不会终止计算中涉及的过程.我怎样才能做到这一点?
我不想启动异常并停止程序.基本上我想要的是当f超时时,让它返回None然后终止所涉及的过程.
解决方法 虽然我同意Aaron回答的要点,但我想详细说明一下.必须在要装饰的函数中停止多处理启动的进程;我不认为这可以通常从装饰器本身完成(装饰函数是唯一知道它启动了什么计算的实体).
您可以捕获自定义的TimedOutExc异常,而不是使装饰函数捕获SIgalARM,这可能更灵活.那么你的例子将成为:
class TimedOutExc(Exception): """ Raised when a timeout happens """def timeout(timeout): """ Return a decorator that raises a TimedOutExc exception after timeout seconds,if the decorated function dID not return. """ def decorate(f): def handler(signum,**kwargs): old_handler = signal.signal(signal.SIgalRM,handler) signal.alarm(timeout) result = f(*args,**kwargs) # f() always returns,in this scheme signal.signal(signal.SIgalRM,old_handler) # old signal handler is restored signal.alarm(0) # Alarm removed return result new_f.func_name = f.func_name return new_f return decorate@timeout(10)def function_that_takes_a_long_time(): try: # ... long,parallel calculation ... except TimedOutExc: # ... Code that shuts down the processes ... # ... return None # Or exception raised,which means that the calculation is not complete总结
以上是内存溢出为你收集整理的python – 在多处理函数上超时装饰器全部内容,希望文章能够帮你解决python – 在多处理函数上超时装饰器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)