详解python中自定义超时异常的几种方法


Posted in Python onJuly 29, 2019

最近在项目中调用第三方接口时候,经常会出现请求超时的情况,或者参数的问题导致调用异代码异常。针对超时异常,查询了python 相关文档,没有并发现完善的包来根据用户自定义的时间来抛出超时异常的模块。所以自己干脆自己来实现一个自定义的超时异常。目前找到了两种方式来实现超时异常的功能(signal.alarm()、threading实现超时异常)

方法1 thread + time 

原理:将要调用的功能函数放入子线程,通过设定子线程的阻塞时间,超时则主线程并不会等待子线程的执行。主线程退出,子线程就不存在了。

核心就是在程序中添加 join()方法,用于等待线程结束。join()的作用是,在子线程完成运行之前,这个子线程的父线程将会被一直阻塞.

# coding=utf-8
import threading
import time


def myFunc():
  time.sleep(4)
  print("myFunc执行了")


if __name__ == '__main__':
  t = threading.Thread(target=myFunc)
  t.setDaemon(True)
  t.start()

  t.join(2)
  print("it's over")

执行结果:

it's over

可以看出,当主线程执行到2秒时候,结束退出。子线程还没有结束,没有执行完及被强制退出

# coding=utf-8
import threading
import time


def myFunc():
  time.sleep(1)
  print("myFunc执行了")


if __name__ == '__main__':
  t = threading.Thread(target=myFunc)
  t.setDaemon(True)
  t.start()

  t.join(2)
  print("it's over")

显示结果:

myFunc执行了
it's over

可以看出,子线程结束时,用时1秒,没有超过主线程设定的3秒,所以主线程与子线程都被执行了

方法 2  signal.alarm() ,注意两点:一是signal信号机制要在linux上才能运行; 二是signal信号在主线程中才会会起作用

import signal
import time

# Define signal handler function
def myHandler(signum, frame):
  exit("TimeoutError")

def test_fun():
  # time.sleep(3)
  int("afsdf")
  a = 2 + 3
  return a

if __name__ == '__main__':
  try:
    signal.signal(signal.SIGALRM, myHandler)
    signal.alarm(2)
    test = test_fun()
    print(test)
    signal.alarm(0)
  except Exception as ret:
    print("msg:", ret)

执行结果:

当 time.sleep(3) 时,会抛出TimeoutError的异常
当 test_fun 里面出现 int("afsdf")时, 会抛出 ValueError("invalid literal for int()         with base 10: 'afsdf'",))
当test_fun函数执行的时间小于2 秒时,就会返回函数对应的值

方法3  带有返回值的超时异常,可以通过创建thread类的方式来进行捕捉

import threading
import sys
import time


class Dispacher(threading.Thread):
  def __init__(self, fun, args):
    threading.Thread.__init__(self)
    self.setDaemon(True)
    self.result = None
    self.error = None
    self.fun = fun
    self.args = args

    self.start()

  def run(self):
    try:
      self.result = self.fun(self.args)
    except:
      self.error = sys.exc_info()


def test_fun(i):
  # time.sleep(4)
  a = i*i
  # b  

return a
def main_fun():
  c = Dispacher(test_fun, 2)
  c.join(2)

  if c.isAlive():
    return "TimeOutError"
  elif c.error:
    return c.error[1]
  t = c.result
  return t

if __name__ == '__main__':
  fun = main_fun()
  print(fun)

显示结果:

test_fun 执行时间大于设置的2秒时,会抛出TimeOutError
test_fun 执行时间小于设置的2秒时,并且函数正常执行时,显示:4
test_fun 里面出现比如 “b” 时,会抛出 global name 'b' is not defined 的异常

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
Apr 12 Python
Python字典及字典基本操作方法详解
Jan 30 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
Apr 23 Python
python实现猜数字小游戏
Mar 24 Python
pyshp创建shp点文件的方法
Dec 31 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
Apr 15 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
Jun 19 Python
Python中使用gflags实例及原理解析
Dec 13 Python
浅谈matplotlib.pyplot与axes的关系
Mar 06 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
Apr 22 Python
Python类的继承super相关原理解析
Oct 22 Python
python数字图像处理之图像的批量处理
Jun 28 Python
Python 离线工作环境搭建的方法步骤
Jul 29 #Python
如何通过python的fabric包完成代码上传部署
Jul 29 #Python
Python八皇后问题解答过程详解
Jul 29 #Python
python 标准差计算的实现(std)
Jul 29 #Python
Python 二叉树的层序建立与三种遍历实现详解
Jul 29 #Python
Python完成哈夫曼树编码过程及原理详解
Jul 29 #Python
Python秒算24点实现及原理详解
Jul 29 #Python
You might like
php设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
php跨站攻击实例分析
2014/10/28 PHP
php绘制一个矩形的方法
2015/01/24 PHP
PHP常用操作类之通信数据封装类的实现
2017/07/16 PHP
Yii2.0 RESTful API 基础配置教程详解
2018/12/26 PHP
详解php中生成标准uuid(guid)的方法
2019/04/28 PHP
PHP常用函数之获取汉字首字母功能示例
2019/10/21 PHP
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
S2SH整合JQuery+Ajax实现登录验证功能实现代码
2013/01/30 Javascript
js判断为空Null与字符串为空简写方法
2014/02/24 Javascript
用Vue.js实现监听属性的变化
2016/11/17 Javascript
vue如何集成raphael.js中国地图的方法示例
2017/08/15 Javascript
解决Mac node版本升级失败的问题
2018/05/16 Javascript
layui select获取自定义属性方法
2018/08/15 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
vant实现购物车功能
2020/06/29 Javascript
python中实现延时回调普通函数示例代码
2017/09/08 Python
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
python脚本生成caffe train_list.txt的方法
2018/04/27 Python
用python一行代码得到数组中某个元素的个数方法
2019/01/28 Python
python实现简单五子棋游戏
2019/06/18 Python
Python 获取命令行参数内容及参数个数的实例
2019/12/20 Python
Python多进程编程multiprocessing代码实例
2020/03/12 Python
Python如何给函数库增加日志功能
2020/08/04 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
Python+Xlwings 删除Excel的行和列
2020/12/19 Python
澳大利亚家用电器在线商店:Billy Guyatts
2020/05/05 全球购物
大学生求职中的自我评价
2013/10/01 职场文书
最常使用的求职信
2014/05/25 职场文书
银行求职信
2014/05/31 职场文书
县政府办公室领导班子个人对照检查材料
2014/09/16 职场文书
党员对十八届四中全会的期盼思想汇报范文
2014/10/17 职场文书
2014年医院个人工作总结
2014/12/09 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
初中信息技术教学计划
2015/01/22 职场文书
太空授课观后感
2015/06/17 职场文书