我正在尝试在python中编写一个TTL装饰器.基本上,如果函数在所选时间内没有回答,我会提出异常.
您可以在http://sebulba.wikispaces.com/recipe+thread2上找到thead2片段
from thread2 import Thread """ A TTL decorator. """ class Worker(Thread): def __init__(self, q, f, args, kvargs): Thread.__init__(self) self.q = q self.f = f self.args = args self.kvargs = kvargs def run(self,): try: res = (True, self.f(*self.args, **self.kvargs)) self.q.put(res) except Exception, e: self.q.put((False, e)) class Referee(Thread): def __init__(self,q, ttl,exception_factory): Thread.__init__(self) self.exception_factory=exception_factory self.q=q self.ttl=ttl def run(self): time.sleep(self.ttl) res = (False, self.exception_factory()) self.q.put(res) def raise_if_too_long(ttl, exception_factory=lambda :RuntimeError("Timeout")): def raise_if_too_long_aux(f): def ritl(*args,**kvargs): q = Queue.Queue(2) referee = Referee(q, ttl, exception_factory) worker = Worker(q,f,args,kvargs) worker.start() referee.start() (valid, res)= q.get(1) q.task_done() referee.terminate() worker.terminate() if valid: return res else: raise res return ritl return raise_if_too_long_aux
但是,我得到了一些非常糟糕的结果.似乎有时函数返回正常但装饰器在达到TTL并且错误增加之前不会返回.
你在这段代码中看到了什么问题吗?在python中是否有一个通用的方法/库来编写TTL函数?
提供的代码有点难以理解 - 如何在正确的线程中在正确的时间在正确的位置引发异常?
考虑这个粗略的流程:
用目标函数调用Decorator函数.返回一个函数:
启动线程,调用目标函数
使用thread.join([timeout])连接到线程
如果超时,则引发异常,并忽略该线程的结果.
如果没有超时,请捕获线程的结果并将其返回.
(你需要设计一种方法来捕获线程的输出......)
有关线程超时的信息,请参见http://docs.python.org/library/threading.html
(或者只是开始使用erlang :)