我正在尝试用 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 :)
关于python - 用 Python 写一个 TTL 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/576776/