python - 用 Python 写一个 TTL 装饰器

标签 python decorator 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 编写函数?

最佳答案

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

考虑一下这个粗略的流程:

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

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

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

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

(或者开始使用 erlang :)

关于python - 用 Python 写一个 TTL 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/576776/

相关文章:

python - 我在哪里可以获得 Python 2.7 中的 restful_lib 模块以及如何安装该模块

python - 装饰器不能与 yield 命令一起正常工作

python-2.7 - functools.wrapper - AttributeError : attribute '__doc__' of 'type' objects is not writable

linux - 如何监视新的网络连接 TTL

cassandra - 如何通过在 Cassandra 中设置单独的生存时间 (TTL) 属性来使集合中的每个元素过期?

jms - activemq 队列中所有消息的生存时间

python - 为什么 QWebEngineUrlRequestInterceptor 在 app.quit() 之后仍然存在

python - 使用 SQLAlchemy ORM 高效更新数据库

python - 在 lambda 中使用上下文管理器,怎么样?

python - python中的单例,闭包在装饰器内不起作用