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中__new__与__init__方法的区别详解
May 04 Python
浅析Python中MySQLdb的事务处理功能
Sep 21 Python
python删除服务器文件代码示例
Feb 09 Python
python判断字符串或者集合是否为空的实例
Jan 23 Python
详解Python 调用C# dll库最简方法
Jun 20 Python
TensorFlow索引与切片的实现方法
Nov 20 Python
tensorflow之变量初始化(tf.Variable)使用详解
Feb 06 Python
Python虚拟环境的创建和使用详解
Sep 07 Python
python如何利用paramiko执行服务器命令
Nov 07 Python
python 实现图片修复(可用于去水印)
Nov 19 Python
Python中X[:,0]和X[:,1]的用法
May 10 Python
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
May 22 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
环境会对咖啡种植有什么影响
2021/03/03 咖啡文化
PHP中的traits简单使用实例
2015/05/13 PHP
php获取汉字拼音首字母的方法
2015/10/21 PHP
PHP的mysqli_ssl_set()函数讲解
2019/01/23 PHP
php连接mysql数据库最简单的实现方法
2019/09/24 PHP
PHP手机号码及邮箱正则表达式实例解析
2020/07/11 PHP
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
JavaScript Event学习第十章 一些可替换的事件对
2010/02/10 Javascript
js 未结束的字符串常量错误解决方法
2010/06/13 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
2014/04/29 Javascript
jQuery多项选项卡的实现思路附样式及代码
2014/06/03 Javascript
js实现多选项切换导航菜单的方法
2015/02/06 Javascript
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
详解Vue webapp项目通过HBulider打包原生APP
2018/06/29 Javascript
详解微信小程序开发之formId使用(模板消息)
2019/08/27 Javascript
nodejs如何在package.json中设置多条启动命令
2020/03/16 NodeJs
前端 javascript 实现文件下载的示例
2020/11/24 Javascript
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
[39:07]LGD vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
Python OpenCV视频截取并保存实现代码
2019/11/30 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
2019/12/12 Python
TensorFlow实现自定义Op方式
2020/02/04 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
2020/10/22 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
英国翻新电子产品购物网站:Tech Trade
2017/12/25 全球购物
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
西班牙Polo衫品牌:Polo Club
2020/08/09 全球购物
读书活动总结范文
2014/04/26 职场文书
求职信名称怎么写
2014/05/26 职场文书
房地产端午节活动方案
2014/08/24 职场文书
个人四风问题原因分析及整改措施
2014/09/28 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
mysql 8.0.24 安装配置方法图文教程
2021/05/12 MySQL
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android