python使用装饰器和线程限制函数执行时间的方法


Posted in Python onApril 18, 2015

本文实例讲述了python使用装饰器和线程限制函数执行时间的方法。分享给大家供大家参考。具体分析如下:

很多时候函数内部包含了一些不可预知的事情,比如调用其它软件,从网络抓取信息,可能某个函数会卡在某个地方不动态,这段代码可以用来限制函数的执行时间,只需要在函数的上方添加一个装饰器,timelimited(2)就可以限定函数必须在2秒内执行完成,如果执行完成则返回函数正常的返回值,如果执行超时则会抛出错误信息。

# -*- coding: utf-8 -*-
from threading import Thread
import time
class TimeoutException(Exception):
  pass
ThreadStop = Thread._Thread__stop#获取私有函数
def timelimited(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 =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
@timelimited(2)
def fn_1(secs):
  time.sleep(secs)
  return 'Finished'
if __name__ == "__main__":
  print fn_1(4)

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
Python内置的字符串处理函数整理
Jan 29 Python
python解析html开发库pyquery使用方法
Feb 07 Python
python实现多线程的两种方式
May 22 Python
Python wxPython库消息对话框MessageDialog用法示例
Sep 03 Python
自学python的建议和周期预算
Jan 30 Python
numpy中的ndarray方法和属性详解
May 27 Python
python实现最大子序和(分治+动态规划)
Jul 05 Python
python通过TimedRotatingFileHandler按时间切割日志
Jul 17 Python
Python求平面内点到直线距离的实现
Jan 19 Python
python使用openpyxl库读写Excel表格的方法(增删改查操作)
May 02 Python
python如何利用traceback获取详细的异常信息
Jun 05 Python
Python用tkinter实现自定义记事本的方法详解
Mar 31 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
Apr 18 #Python
python对指定目录下文件进行批量重命名的方法
Apr 18 #Python
python开启多个子进程并行运行的方法
Apr 18 #Python
C#返回当前系统所有可用驱动器符号的方法
Apr 18 #Python
python关闭windows进程的方法
Apr 18 #Python
python使用Queue在多个子进程间交换数据的方法
Apr 18 #Python
python获取当前计算机cpu数量的方法
Apr 18 #Python
You might like
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
php解析mht文件转换成html的实例
2017/03/13 PHP
使用laravel的migrate创建数据表的方法
2019/09/30 PHP
JavaScript入门教程(6) Window窗口对象
2009/01/31 Javascript
jQuery插件原来如此简单 jQuery插件的机制及实战
2012/02/07 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
javascript如何定义对象数组
2016/06/07 Javascript
详解前后端分离之VueJS前端
2017/05/24 Javascript
vue使用Axios做ajax请求详解
2017/06/07 Javascript
使用JS组件实现带ToolTip验证框的实例代码
2017/08/23 Javascript
Vue组件中slot的用法
2018/01/30 Javascript
详解vue配置后台接口方式
2019/03/29 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
如何管理Vue中的缓存页面
2021/02/06 Vue.js
python文件和目录操作函数小结
2014/07/11 Python
详解python的数字类型变量与其方法
2016/11/20 Python
关于Python中空格字符串处理的技巧总结
2017/08/10 Python
用TensorFlow实现lasso回归和岭回归算法的示例
2018/05/02 Python
python  Django中的apps.py的目的是什么
2018/10/15 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
Django 导出项目依赖库到 requirements.txt过程解析
2019/08/23 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
Django 返回json数据的实现示例
2020/03/05 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
2020/09/29 Python
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
迟到早退检讨书
2014/02/10 职场文书
大学生感恩父母演讲稿
2014/08/28 职场文书
学校领导班子群众路线整改措施
2014/09/16 职场文书
一年级语文上册复习计划
2015/01/17 职场文书
小学教师工作总结2015
2015/04/07 职场文书
导游词之黄果树瀑布
2019/09/20 职场文书
JS如何使用剪贴板操作Clipboard API
2021/05/17 Javascript
Python操作CSV格式文件的方法大全
2021/07/15 Python
TypeScript 内置高级类型编程示例
2022/09/23 Javascript