python 超时装饰器
#************************************************************** 设置超时的装饰器 **************************************************************
# 装饰器设置超时时间
# class TimeoutException(Exception):
# pass
# ThreadStop = Thread._Thread__stop
#
# def set_timeout_limit(timeout):
# def decorator(function):
# def decorator2(*args, **kwargs):
# 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, e:
# self._error = str(e)
#
# def _stop(self):
# if self.isAlive():
# ThreadStop(self)
#
# t = TimeLimited()
# t.start()
# t.join(timeout)
# if isinstance(t._error, TimeoutException):
# t._stop()
# raise TimeoutException('timeout for %s' % (repr(function)))
# if t.isAlive():
# t._stop()
# raise TimeoutException('timeout for %s' % (repr(function)))
# if t._error is None:
# return t.result
# return decorator2
# return decorator
# # 装饰器设置超时时间
# def set_timeout_limit(t):
# def auto_quit(t1):
# '''此为控制进程超时退出的线程函数'''
# time.sleep(t1)
# print("time out {}".format(t1))
# os._exit(1) #此函数专门用于线程控制主进程退出,有兴趣的可以看一下和sys.exit()的区别
# def decorator(f):
# '''此函数用于传入被装饰函数f'''
# @wraps(f)
# def wrapper(*args,**kwargs):
# '''装饰器内部遵循的逻辑是:
# 1.auto_quit先执行完,进程结束
# 2.被修饰函数f先执行完,auto_quit函数停止执行
# 3.被修饰函数执行完,下面的代码才能运行
# '''
# t1=Thread(target=auto_quit,args=(t,)) #此处的t是set_time_limit函数的形参,是auto_quit函数的实参
# t2=Thread(target=f,args=args,kwargs=kwargs)
# t1.setDaemon(True) #满足第2点
# t1.start()
# t2.start()
# t2.join() #满足第3点
# return wrapper
# return decorator
***还有一种方法,多线程设置成守护线程。主线程退出,其他线程也会退出。达到超时退出的目的。
原文地址:https://www.cnblogs.com/xlw-blogs/p/15162891.html
- Java开源博客My-Blog之mysql容器重复初始化的严重bug修复过程
- 负margin的原理以及应用
- 关于exp/imp的总结学习(r4笔记第26天)
- 除了写烂的手写数据分类,你会不会做自定义图像数据集的识别?!
- shell脚本中字符串的常见操作及"command not found"报错处理(附源码)
- 绝对定位下的盒模型
- 运行shell脚本时报错"[[ : not found"解决方法
- 关于表联结方法(二) (r4笔记第23天)
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(一)设计一套好的RESTful API
- XSS分析及预防
- 关于ORA-01779问题的分析和解决 (r4笔记第22天)
- 想看爱奇艺VIP视频?一个python脚本帮你搞定
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十四)Redis缓存正确的使用姿势
- 关于shell中的pl/sql脚本错误排查与分析(r4笔记第21天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- TCP 协议面试灵魂 12 问,问到你怀疑人生!
- 方差分析简介(结合COVID-19案例)
- mysql计算两个时间字段的时间差
- 学生党学编程,有这个开源项目就够了!
- 【最强ResNet改进系列】Res2Net:一种新的多尺度网络结构,性能提升显著
- Java中的锁以及sychronized实现机制(十)
- Web 指纹识别之路
- RedisTemplate常用集合使用说明-opsForHash(四)
- Mybatis高级查询(二):多表联合查询
- Maven配置多仓库无效?来看看这篇文章
- Spring Boot启动slf4j提示找不到weblogic.xml日志异常
- Angular 应用的DevDependencies
- 轻量级服务网格 - osm
- 漫画:设计模式之 “外观模式”
- 使用 Zotero 在 Markdown 中优雅处理参考文献