我想在Python中編寫TTL裝飾器。 基本上,如果功能在選定時間內沒有 回答,我會提出異常。在Python中編寫TTL裝飾器
您可以在http://sebulba.wikispaces.com/recipe+thread2
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
找到thead2片斷不過,我得到一些非常糟糕的結果。 似乎有時函數返回正常 裝飾器不會返回,直到達到TTL並且錯誤 引發。
您是否在此代碼中看到錯誤? 有沒有一種常見的方法/庫在python中用TTL編寫函數?
謝謝你真的幫了忙。我不知道thread.join(超時)。 – fulmicoton 2009-02-23 07:48:11