ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

用Python编写TTL装饰器

2019-10-24 15:58:35  阅读:181  来源: 互联网

标签:decorator ttl python


我正在尝试在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 :)

标签:decorator,ttl,python
来源: https://codeday.me/bug/20191024/1921513.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有