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用于url解码和中文解析的小脚本(python url decoder)
Aug 11 Python
从零学Python之hello world
May 21 Python
Python实现基于HTTP文件传输实例
Nov 08 Python
Django 浅谈根据配置生成SQL语句的问题
May 29 Python
详解python读取和输出到txt
Mar 29 Python
django 中的聚合函数,分组函数,F 查询,Q查询
Jul 25 Python
python实现BP神经网络回归预测模型
Aug 09 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
Jan 03 Python
python实现删除列表中某个元素的3种方法
Jan 15 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
Apr 29 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
Jul 01 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
Jul 20 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
提升PHP执行速度全攻略(下)
2006/10/09 PHP
PHP简单实现“相关文章推荐”功能的方法
2014/07/19 PHP
PHP实现获取某个月份周次信息的方法
2015/08/11 PHP
php实现头像上传预览功能
2017/04/27 PHP
TP5多入口设置实例讲解
2020/12/15 PHP
ejs v9 javascript模板系统
2012/03/21 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
2013/05/03 Javascript
js常用自定义公共函数汇总
2014/01/15 Javascript
node.js使用nodemailer发送邮件实例
2014/03/10 Javascript
jquery图片轮播插件仿支付宝2013版全屏图片幻灯片
2014/04/03 Javascript
jQuery插件zTree实现清空选中第一个节点所有子节点的方法
2017/03/08 Javascript
angular过滤器实现排序功能
2017/06/27 Javascript
原生JavaScript实现的简单放大镜效果示例
2018/02/07 Javascript
vue项目中api接口管理总结
2018/04/20 Javascript
Vue 中mixin 的用法详解
2018/04/23 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
[01:57]2016完美“圣”典风云人物:国士无双专访
2016/12/04 DOTA
[54:24]Optic vs TNC 2018国际邀请赛小组赛BO2 第二场
2018/08/18 DOTA
简介Python设计模式中的代理模式与模板方法模式编程
2016/02/02 Python
python验证码识别的实例详解
2016/09/09 Python
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
基于python代码实现简易滤除数字的方法
2018/07/17 Python
使用tensorflow显示pb模型的所有网络结点方式
2020/01/23 Python
python剪切视频与合并视频的实现
2020/03/03 Python
Python 分布式缓存之Reids数据类型操作详解
2020/06/24 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
HTML5 3D书本翻页动画的实现示例
2019/08/28 HTML / CSS
美国女士内衣在线折扣商店:One Hanes Place
2019/03/24 全球购物
英国在线药房和在线药剂师:Chemist 4 U
2020/01/05 全球购物
方正Java笔试题
2014/07/03 面试题
党的群众路线教育实践活动宣传方案
2014/02/23 职场文书
技校毕业生自荐信范文
2014/03/07 职场文书
公司优秀员工获奖感言
2014/08/14 职场文书
党员教师批评与自我批评发言稿
2014/10/15 职场文书
校运会班级霸气口号
2015/12/24 职场文书