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

yipeiwu_com6年前Python基础

本文实例讲述了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程序设计有所帮助。

相关文章

TensorFlow利用saver保存和提取参数的实例

TensorFlow利用saver保存和提取参数的实例

在训练循环中,定期调用 saver.save() 方法,向文件夹中写入包含了当前模型中所有可训练变量的 checkpoint 文件。 saver.save(sess, FLAGS.t...

Django应用程序中如何发送电子邮件详解

Django应用程序中如何发送电子邮件详解

前言 在Django应用程序中发送电子邮件最常见的用例是密码重置、帐户激活和发送与您的应用程序相关的一般通知。下面来看看详细的介绍吧。 配置Django发送电子邮件 要配置您的Djang...

Python基础教程之tcp socket编程详解及简单实例

Python tcp socket编程详解 初学脚本语言Python,测试可用的tcp通讯程序: 服务器: #!/usr/bin/env python # -*- coding:...

python数据处理 根据颜色对图片进行分类的方法

python数据处理 根据颜色对图片进行分类的方法

前面一篇文章有说过,利用scrapy来爬取图片,是为了对图片数据进行分类而收集数据。 本篇文章就是利用上次爬取的图片数据,根据图片的颜色特征来做一个简单的分类处理。 实现步骤如下: 1:...

python解析html开发库pyquery使用方法

例如 复制代码 代码如下:<div id="info"><span><span class='pl'>导演</span>: <a h...