详解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 相关文章推荐
用PyQt进行Python图形界面的程序的开发的入门指引
Apr 14 Python
Python实现队列的方法
May 26 Python
如何处理Python3.4 使用pymssql 乱码问题
Jan 08 Python
python爬虫使用cookie登录详解
Dec 27 Python
PYTHON基础-时间日期处理小结
May 05 Python
Python实现ping指定IP的示例
Jun 04 Python
python 以16进制打印输出的方法
Jul 09 Python
图文详解Django使用Pycharm连接MySQL数据库
Aug 09 Python
详解使用django-mama-cas快速搭建CAS服务的实现
Oct 30 Python
Pytorch GPU显存充足却显示out of memory的解决方式
Jan 13 Python
将数据集制作成VOC数据集格式的实例
Feb 17 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
实用函数4
2007/11/08 PHP
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
2011/07/17 PHP
php获取用户浏览器版本的方法
2015/01/03 PHP
详解PHP实现执行定时任务
2015/12/21 PHP
Yii2如何批量添加数据
2016/05/17 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
深入理解jquery跨域请求方法
2016/05/18 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
类似于QQ的右滑删除效果的实现方法
2016/10/16 Javascript
移动端触屏幻灯片图片切换插件idangerous swiper.js
2017/04/10 Javascript
JavaScript中使用webuploader实现上传视频功能(demo)
2017/04/10 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
详解Js中的模块化是如何实现的
2017/10/18 Javascript
AngularJS遍历获取数组元素的方法示例
2017/11/11 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
2018/01/18 Javascript
layui之select的option叠加问题的解决方法
2018/03/08 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
命令行批量截图Node脚本示例代码
2019/01/25 Javascript
jQuery层叠选择器用法实例分析
2019/06/28 jQuery
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
如何利用javascript接收json信息并进行处理
2020/08/06 Javascript
python回调函数的使用方法
2014/01/23 Python
python里对list中的整数求平均并排序
2014/09/12 Python
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
对python pandas 画移动平均线的方法详解
2018/11/28 Python
Python实现数值积分方式
2019/11/20 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
sort命令的作用和用法
2013/08/25 面试题
单位介绍信范文
2014/01/18 职场文书
业务部主管岗位职责
2014/01/29 职场文书
网上商城创业计划书范文
2014/01/31 职场文书
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
党的群众路线教育实践方案
2014/05/11 职场文书
公共艺术专业自荐信
2014/09/01 职场文书
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python