首页 / PYTHON / 用Python编写TTL装饰器
用Python编写TTL装饰器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了用Python编写TTL装饰器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1683字,纯文字阅读大概需要3分钟。
内容图文
![用Python编写TTL装饰器](/upload/InfoBanner/zyjiaocheng/687/e9bd2d174ddb4a608177332f36b4fb5e.jpg)
我正在尝试在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编写TTL装饰器全部内容,希望文章能够帮你解决用Python编写TTL装饰器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。