当前位置:  开发笔记 > 编程语言 > 正文

用Python编写TTL装饰器

如何解决《用Python编写TTL装饰器》经验,为你挑选了1个好方法。

我正在尝试在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函数?



1> gahooa..:

提供的代码有点难以理解 - 如何在正确的线程中在正确的时间在正确的位置引发异常?

考虑这个粗略的流程:

用目标函数调用Decorator函数.返回一个函数:

    启动线程,调用目标函数

    使用thread.join([timeout])连接到线程

    如果超时,则引发异常,并忽略该线程的结果.

    如果没有超时,请捕获线程的结果并将其返回.

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

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

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

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有