详解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的Django框架下管理站点的基本方法
Jul 17 Python
python利用lxml读写xml格式的文件
Aug 10 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
Jul 12 Python
pyqt5的QWebEngineView 使用模板的方法
Aug 18 Python
python try 异常处理(史上最全)
Mar 07 Python
使用python制作一个为hex文件增加版本号的脚本实例
Jun 12 Python
解决python super()调用多重继承函数的问题
Jun 26 Python
python简单实现矩阵的乘,加,转置和逆运算示例
Jul 10 Python
解决Jupyter NoteBook输出的图表太小看不清问题
Apr 16 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
May 22 Python
Python中常见的数制转换有哪些
May 27 Python
浅谈Python3中print函数的换行
Aug 05 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
一个好用的分页函数
2006/11/16 PHP
PHP可变函数学习小结
2015/11/29 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
jQuery产品间断向下滚动效果核心代码
2014/05/08 Javascript
jQuery中attr()方法用法实例
2015/01/05 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
jQuery 操作input中radio的技巧
2016/07/18 Javascript
JavaScript探测CSS动画是否已经完成的方法
2016/08/30 Javascript
BootStrap Table 后台数据绑定、特殊列处理、排序功能
2017/05/27 Javascript
关于webpack2和模块打包的新手指南(小结)
2017/08/07 Javascript
JSON对象转化为字符串详解
2017/08/11 Javascript
vue.js层叠轮播效果的实例代码
2018/11/08 Javascript
4 种滚动吸顶实现方式的比较
2019/04/09 Javascript
js如何实现元素曝光上报
2019/08/07 Javascript
Node 模块原理与用法详解
2020/05/13 Javascript
基于vue的video播放器的实现示例
2021/02/19 Vue.js
[03:03]DOTA2 2017国际邀请赛开幕战队入场仪式
2017/08/09 DOTA
Python urlopen()函数 示例分享
2014/06/12 Python
解决pandas 作图无法显示中文的问题
2018/05/24 Python
Python多进程原理与用法分析
2018/08/21 Python
基于Python+Appium实现京东双十一自动领金币功能
2019/10/31 Python
Python selenium爬取微博数据代码实例
2020/05/22 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
使用数据结构给女朋友写个Html5走迷宫游戏
2019/11/26 HTML / CSS
美国领先的在线旅游网站:Orbitz
2018/11/05 全球购物
阿联酋最好的手机、电子产品和家用电器网上商店:Eros Digital Home
2020/08/09 全球购物
戴尔荷兰官方网站:Dell荷兰
2020/10/04 全球购物
辞职信模板(中英文版)
2015/02/27 职场文书
2015年先进个人自荐书
2015/03/24 职场文书
详解MySQL 联合查询优化机制
2021/05/10 MySQL