python 装饰器实践,实现定时函数和失败异常重复调用

执行请求或函数,出现异常情况下指定重复执行次数
可以作为一个包调用
方法 get()和post 做请求,execcunt = 指定请求失败再次请求次数
方法loopExecution作为装饰器,循环执行函数,execcunt = 指定异常再次执行次数

#函数异常情况下再次执行,执行次数


import traceback
def loopExecution(func):def wrapper(*args,**kwargs):count = kwargs.pop("execcount", 1)try:res = func(*args,**kwargs)except Exception as err:for i in range(count):try:res = func(*args,**kwargs)if isinstance(res,Exception):return resexcept Exception as err:pass#失败到达限定值返回异常信息return traceback.format_exc()# return Nonereturn resreturn wrapper@loopExecution
def func():print("我是一个函数")raise Exception("执行失败了")if __name__ == '__main__':data = func(execcount=6)print("多次失败情况下返回的数据:",data)

通用请求,指定请求次数,将其作为一个包调用,如包名为my_request
import my_reqeust
response = my_request.get(url)

import time
import requests
import traceback
from requests import Session
from functools import partialsession = Session()
traceback_info = Nonedef outer(func):def wrapper(*args,**kwargs):count = kwargs.pop("execcount", 1)res = func(*args,**kwargs)if isinstance(res, Exception):for i in range(count):print(i)res = func(*args,**kwargs)if not isinstance(res, Exception):breakif isinstance(res, Exception):return Nonereturn resreturn wrapper@outer
def publicRequsts(*args,**kwargs):"""通用请求方法"""method = args[0] if len(args) is 1 else kwargs.pop("method", "GET")if not method in ("GET","POST"):raise Exception("The request method is illegal")url = args[1] if len(args) is 2 else kwargs.pop("url", None)if url is None or not isinstance(url,str) or not "http" in url:raise Exception("The URL is illegal")try:response = session.request(method, url,**kwargs)print("="*10)except Exception as err:global traceback_infotraceback_info = traceback.format_exc()return errreturn responseget = partial(publicRequsts, "GET")
post = partial(publicRequsts, "POST")

使用线程对执行函数限制执行时间,可不加定时为非阻塞,加定时间到会强制停止线程

from threading import Thread
import threading
import inspect
import ctypesdef _async_raise(tid, exctype):"""raises 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("invalid 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")def stop_thread(thread):_async_raise(thread.ident, SystemExit)def timelimited(exectime=None):def decorator(function):def decorator2(*args, **kwargs):time_out = exectime if not exectime is None else kwargs.pop("exectime",None)if time_out is None:return Exception("exec time param missing ")class TimeLimited(threading.Thread):def __init__(self, _error=None, ):Thread.__init__(self)self._error = _errorself._result = Nonedef run(self):try:result = function(*args, **kwargs)if result is None:self._result = Trueelse:self._result = resultexcept Exception as err:self._error = Exception(err)t = TimeLimited()t.setDaemon(True)t.start()if not time_out is False:t.join(time_out)if isinstance(t._error, Exception):return t._errorelse:if t._result is None:stop_thread(t)return Exception("Time out!")else:return t._resultreturn decorator2return decorator@timelimited(exectime=3)# 设置运行超时时间S,优先使用,exectime=False是不加定时
def func():time.sleep(5)print("==========")print("==========")print("==========")print("==========")return "aaaa"if __name__ == "__main__":print(func())time.sleep(4)print(threading.enumerate())time.sleep(6)

python 装饰器实践,实现定时函数和失败异常重复调用相关推荐

  1. Python装饰器是什么?使用Python装饰器实现计算程序(函数)运行时间的功能

    Python装饰器是什么?使用Python装饰器实现计算程序(函数)运行时间的功能 目录

  2. python装饰器与闭包_Python:函数装饰器和闭包

    摘自<流畅的python> 7.1 装饰器基础知识 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数). 装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用 ...

  3. Python装饰器、内置函数之金兰契友

    装饰器:装饰器的实质就是一个闭包,而闭包又是嵌套函数的一种.所以也可以理解装饰器是一种特殊的函数. 因为程序一般都遵守开放封闭原则,软件在设计初期不可能把所有情况都想到,所以一般软件都支持功能上的扩展 ...

  4. python装饰器 稀里糊涂_万恶之源 - Python装饰器及内置函数

    装饰器 听名字应该知道这是一个装饰的东西,我们今天就来讲解一下装饰器,有的铁子们应该听说,有的没有听说过.没有关系我告诉你们这是一个很神奇的东西 这个有多神奇呢? 我们先来复习一下闭包 def fun ...

  5. python装饰器记录每一个函数的执行时间

    下面这段代码中的hello()函数使用装饰器,直接调用hello时,会用装饰器中的print_time的wrapper函数覆盖掉原有的函数,因此实现的功能就是先执行函数,然后打印函数执行的时间 imp ...

  6. python装饰器作用-python 装饰器

    以前你有没有这样一段经历:很久之前你写过一个函数,现在你突然有了个想法就是你想看看,以前那个函数在你数据集上的运行时间是多少,这时候你可以修改之前代码为它加上计时的功能,但是这样的话是不是还要大体读读 ...

  7. python装饰器使用多吗_对于Python装饰器使用的一些建议

    关于python装饰器的问题 这里 函数 man和 woman分别作为func1的参数了嘛?如果是的话为什么会这装饰器函数参数要传函数,而不是字符串. 装饰器函数特点: 1,参数为函数对象 2,使用内 ...

  8. python 装饰器实现_Python装饰器系列01 - 如何正确地实现装饰器

    虽然人们能利用函数闭包(function clouser)写出简单的装饰器,但其可用范围常受限制.多数实现装饰器的基本方式会破坏与内省(Introspection)的关联性. 可大多数人会说:who ...

  9. Python装饰器——四两拨千斤还是杀鸡用牛刀?

    一.引言 最近做了一个小小小项目,写了一些偏工程的代码.项目的目的看起来很简单,就是去组里的一个能显示调试信息网站上,根据我们提供的一堆查询,获取调试信息的response,然后离线的解析来完成后续实 ...

最新文章

  1. 初学者必备的数组相关知识点
  2. 微软表示Edge的性能更优于Chrome和Firefox
  3. Python中的线程、进程、协程以及区别
  4. Thinking in java之前
  5. redis安装+启动和连接+让redis在后台运行
  6. SQL SERVER中的二种获得自增长ID的方法
  7. 如何换ip ,最简单有效的换ip方法在这里
  8. ps计算机设置,不仅要懂PS 浅谈修图电脑配置(基础篇)
  9. Nacos——Distro一致性协议
  10. 免费电子书下载网站汇总
  11. 【更新】CVE-2020-0796:微软紧急发布SMBv3协议“蠕虫级”漏洞补丁通告
  12. MTCNN中的IOU详解
  13. 手机百度浏览器ua标识在哪里_荣耀play浏览器ua标识在哪里
  14. java线段的平移和旋转,几何变换(旋转、缩放、平移)
  15. 2022年了,你还没搞清楚箭头函数与普通函数的区别嘛?
  16. 天梯选拔:先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数
  17. 爬虫工程师想拿更高薪,这点不要忽略
  18. 超级实用!全郑州地铁沿线景点美食全攻略(附首末班时间表)
  19. SQLServer CEILING函数和 FLOOR函数
  20. 爱立信忙收5G专利费;中兴助力LPWAN物联网商用| IoT黑板报

热门文章

  1. 时间序列预测02:经典方法综述 自回归ARIMA/SRIMA 指数平滑法等
  2. c# 时间格式化为英文_C#中如何将日期中的月份转化成英文
  3. vue项目通讯录_Vue实现类似通讯录功能(下)
  4. 51 单片机实战教程(14 外围芯片驱动程序之LTC1658芯片驱动)
  5. android中多渠道打包的三种方式
  6. 用Python实现多国文字全文自动翻译
  7. 总结一些网站加密和混淆技术
  8. 总结用过的几个视频同步分离电路--LM1881
  9. 适合练习听力的动画排名
  10. Typescript 笔记