详解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装饰器
May 09 Python
python实现杨辉三角思路
Jul 14 Python
关于Python 3中print函数的换行详解
Aug 08 Python
django rest framework之请求与响应(详解)
Nov 06 Python
详解关于Django中ORM数据库迁移的配置
Oct 08 Python
Python第三方库face_recognition在windows上的安装过程
May 03 Python
python实现抠图给证件照换背景源码
Aug 20 Python
wxPython实现分隔窗口
Nov 19 Python
Python高级特性——详解多维数组切片(Slice)
Nov 26 Python
pycharm激活方法到2099年(激活流程)
Sep 22 Python
python 求两个向量的顺时针夹角操作
Mar 04 Python
OpenCV-Python实现图像平滑处理操作
Jun 08 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
2006/12/14 PHP
kohana框架上传文件验证规则写法示例
2014/07/14 PHP
php的ddos攻击解决方法
2015/01/08 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
php框架CodeIgniter使用redis的方法分析
2018/04/13 PHP
PHP 文件写入和读取操作实例详解【必看篇】
2019/11/04 PHP
新发现一个骗链接的方法(js读取cookies)
2012/01/11 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
2013/08/30 Javascript
BootStrap的JS插件之轮播效果案例详解
2016/05/16 Javascript
微信小程序 自定义对话框实例详解
2017/01/20 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
2017/02/16 Javascript
Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
2017/06/09 jQuery
javascript  数组排序与对象排序的实例
2017/07/17 Javascript
解决html input验证只能输入数字,不能输入其他的问题
2017/07/21 Javascript
详解JS中的this、apply、call、bind(经典面试题)
2017/09/19 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
2018/05/31 jQuery
Node.js命令行/批处理中如何更改Linux用户密码浅析
2018/07/22 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
vue点击按钮实现简单页面的切换
2020/09/08 Javascript
python超简单解决约瑟夫环问题
2015/05/12 Python
wxPython之解决闪烁的问题
2018/01/15 Python
Python内置模块logging用法实例分析
2018/02/12 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
CSS3教程(2):网页边框半径和网页圆角
2009/04/02 HTML / CSS
利用纯css3实现的文字亮光特效的代码演示
2014/11/27 HTML / CSS
医学院四年学习生活的自我评价
2013/11/06 职场文书
幼师求职自荐信范文
2014/01/26 职场文书
职工趣味运动会方案
2014/02/10 职场文书
环境建设实施方案
2014/03/14 职场文书
网络工程专业自荐信范文
2014/03/16 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
简单租房协议书(范本)
2014/10/13 职场文书
颐和园导游词400字
2015/01/30 职场文书
小学端午节活动总结
2015/02/11 职场文书
党员转正党支部意见
2015/06/02 职场文书
美丽人生观后感
2015/06/03 职场文书