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中实现单例模式的三种方法
Apr 08 Python
在Python的Django框架中获取单个对象数据的简单方法
Jul 17 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
Jul 13 Python
Python基于回溯法子集树模板解决m着色问题示例
Sep 07 Python
python在新的图片窗口显示图片(图像)的方法
Jul 11 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
Oct 24 Python
基于python的itchat库实现微信聊天机器人(推荐)
Oct 29 Python
python实现四人制扑克牌游戏
Apr 22 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
Jul 02 Python
python-地图可视化组件folium的操作
Dec 14 Python
Python OpenCV快速入门教程
Apr 17 Python
python 三边测量定位的实现代码
Apr 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
php email邮箱正则
2008/10/08 PHP
PHP的cURL库功能简介 抓取网页、POST数据及其他
2011/04/07 PHP
在Linux系统下一键重新安装WordPress的脚本示例
2015/06/30 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
ThinkPHP5框架中使用JWT的方法示例
2020/06/03 PHP
原生js实现改变随意改变div属性style的名称和值的结果
2013/09/26 Javascript
Script标签与访问HTML页面详解
2014/01/10 Javascript
二叉树的非递归后序遍历算法实例详解
2014/02/07 Javascript
动态读取JSON解析键值对的方法
2014/06/03 Javascript
JavaScript实现的伸展收缩型菜单代码
2015/10/14 Javascript
javascript给span标签赋值的方法
2015/11/26 Javascript
简单掌握JavaScript中const声明常量与变量的用法
2016/05/21 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
2016/07/18 Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
2017/03/23 Javascript
AngularJS 教程及实例代码
2017/10/23 Javascript
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
[01:30]DOTA2上海特锦赛现场采访 Loda倾情献唱
2016/03/25 DOTA
[56:29]Secret vs Optic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python基础教程之基本数据类型和变量声明介绍
2014/08/29 Python
win10系统中安装scrapy-1.1
2016/07/03 Python
python字符串替换第一个字符串的方法
2019/06/26 Python
Django中间件基础用法详解
2019/07/18 Python
Python urllib.request对象案例解析
2020/05/11 Python
win10安装python3.6的常见问题
2020/07/01 Python
英国最大的百货公司:Harrods
2016/08/18 全球购物
加拿大约会网站:EliteSingles.ca
2018/01/12 全球购物
大码女装:Ulla Popken
2019/08/06 全球购物
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
莫斯科的韩国化妆品店:Sifo
2019/12/04 全球购物
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
自动一体化专业求职信
2014/03/15 职场文书
电工技术比武方案
2014/05/11 职场文书
义诊活动总结
2015/02/04 职场文书
2015年路政工作总结
2015/05/22 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书
python爬虫请求库httpx和parsel解析库的使用测评
2021/05/10 Python