详解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 相关文章推荐
用smtplib和email封装python发送邮件模块类分享
Feb 17 Python
Python中的列表知识点汇总
Apr 14 Python
python统计文本字符串里单词出现频率的方法
May 26 Python
python实现文件路径和url相互转换的方法
Jul 06 Python
python登录豆瓣并发帖的方法
Jul 08 Python
谈谈如何手动释放Python的内存
Dec 17 Python
Python中字典和集合学习小结
Jul 07 Python
python接口自动化测试之接口数据依赖的实现方法
Apr 26 Python
python 随机森林算法及其优化详解
Jul 11 Python
python由已知数组快速生成新数组的方法
Apr 08 Python
python爬虫数据保存到mongoDB的实例方法
Jul 28 Python
python 实现表情识别
Nov 21 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
缅甸的咖啡简史
2021/03/04 咖啡文化
PHP+MySQL 制作简单的留言本
2009/11/02 PHP
php快速查找数据库中恶意代码的方法
2015/04/01 PHP
PHP编程入门的基本语法知识点总结
2016/01/26 PHP
解析jQuery与其它js(Prototype)库兼容共存
2013/07/04 Javascript
jQuery extend 的简单实例
2013/09/18 Javascript
javascript获取当前鼠标坐标的方法
2015/01/10 Javascript
jquery zTree异步加载简单实例讲解
2016/02/25 Javascript
简单实现jQuery多选框功能
2017/01/09 Javascript
jQuery中的一些小技巧
2017/01/18 Javascript
js获取当前周、上一周、下一周日期
2017/03/19 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
使用JQuery自动完成插件Auto Complete详解
2019/06/18 jQuery
使用p5.js临摹动态图片
2019/11/04 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
[43:51]2018DOTA2亚洲邀请赛3月30日 小组赛B组 EG VS Secret
2018/03/31 DOTA
Python中使用logging模块打印log日志详解
2015/04/05 Python
Python三种遍历文件目录的方法实例代码
2018/01/19 Python
Python使用cx_Oracle模块操作Oracle数据库详解
2018/05/07 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
使用Python中的reduce()函数求积的实例
2019/06/28 Python
Pytorch自己加载单通道图片用作数据集训练的实例
2020/01/18 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
奥巴马演讲稿
2014/01/08 职场文书
运动会解说词200字
2014/02/06 职场文书
测绘专业大学生职业生涯规划书
2014/02/10 职场文书
合作投资意向书
2014/04/01 职场文书
初中信息技术教学计划
2015/01/22 职场文书
研究生论文答辩开场白
2015/05/27 职场文书
毕业班工作总结
2015/08/10 职场文书
机械原理课程设计心得体会
2016/01/15 职场文书
python调用ffmpeg命令行工具便捷操作视频示例实现过程
2021/11/01 Python
python接口测试返回数据为字典取值方式
2022/02/12 Python