python 限时装饰器 广泛应用于接口

python超时装饰器,应用与限时访问接口,比如15min之内下订单,一定时间访问网页,打开视频等等,上代码,用的是多线程监控的方式;

#_*_ coding:utf-8 _*_
import ctypes
import inspect
import time
from threading import Thread

def timelimited(timeout):
    '''
    :function:函数执行超时器
    :param timeout: 限制时间
    :return: none
    '''
    def decorator(function):
        def decorator2(*args,**kwargs):
            class TimeoutException(Exception):
                pass
            def stop_thread(thread):
                def _async_raise(tid,exctype):
                    '''raise the exception,performs cleanup if needed'''
                    tid=ctypes.c_long(tid)
                    if not inspect.isclass(exctype):
                        exctype=type(exctype)
                    res=ctypes.pythonapi.PyThreadState_SetAsyncExc(tid,ctypes.py_object(exctype))
                    if res==0:
                        raise ValueError("invaild thread id")
                    elif res!=1:
                        '''if it returns a number greater than one,you're in trouble
                            and you should call it again with exc=NULL to revert the 
                            effect
                        '''
                        ctypes.pythonapi.PyThreadState_SetAsyncExc(tid,None)
                        raise SystemError("PyThreadState_SetAsyncExc failed")
                _async_raise(thread.ident,SystemExit)
            class TimeLimited(Thread):
                def __init__(self,_error=None,):
                    Thread.__init__(self)
                    self._error=_error
                def run(self):
                    try:
                        self.result=function(*args,**kwargs)
                    except Exception as e:
                        self._error=str(e)
                def stop(self):
                    if self.isAlive():
                        stop_thread(self)
            t=TimeLimited()
            #设置为守护线程
            t.setDaemon(True)
            t.start()
            #最大等待时间
            t.join(timeout)
            if isinstance(t._error,TimeoutException):
                t.stop()
                print('query timeout')
                return False
            if t.isAlive():
                t.stop()
                print("t is alive,query timeout")
                return False
            if t._error is None:
                return t.result
        return decorator2
    return decorator


@timelimited(3)
def testTime(t):
    time.sleep(t)
    print ("already execute it is")



if __name__ == '__main__':
    testTime(5)

C:\Python26\python.exe C:/Users/pwx357471/PycharmProjects/untitled/test.py
testTime(5)时候
t is alive,query timeout

Process finished with exit code 0
C:\Python26\python.exe C:/Users/pwx357471/PycharmProjects/untitled/test.py
testTime(2)时候
already execute it is

Process finished with exit code 0

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值