用Python编写TTL装饰器

我正在尝试在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编写函数的通用方法/库?

解决方法:

提供的代码很难遵循-如何在正确的时间,正确的线程中的正确位置引发异常?

考虑以下粗略流程:

用目标函数调用的装饰函数.返回一个函数:

>启动线程,调用目标函数
>使用thread.join([timeout])加入线程
>如果超时,请引发异常,并忽略线程的结果.
>如果没有超时,请捕获线程的结果并返回它.

(您需要设计一种方法来捕获线程的输出…)

有关线程超时的信息,请参见http://docs.python.org/library/threading.html.

(或者只是开始使用erlang :)

上一篇:Redis特点分析及性能优化


下一篇:TTL (生存时间值)