详解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编码总结(编码类型、格式、转码)
Jul 01 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
May 19 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
Jul 25 Python
对pandas的层次索引与取值的新方法详解
Nov 06 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
Jan 04 Python
对python3中, print横向输出的方法详解
Jan 28 Python
Python如何访问字符串中的值
Feb 09 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
Feb 12 Python
基于Python的Jenkins的二次开发操作
May 12 Python
Java如何基于wsimport调用wcf接口
Jun 17 Python
python判断all函数输出结果是否为true的方法
Dec 03 Python
python实现经典排序算法的示例代码
Feb 07 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 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
php+js iframe实现上传头像界面无跳转
2014/04/29 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
2014/07/29 PHP
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
2016/03/21 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
PHP递归实现汉诺塔问题的方法示例
2017/11/25 PHP
JavaScript 通过模式匹配实现重载
2010/08/12 Javascript
Javascript Throttle & Debounce应用介绍
2013/03/19 Javascript
将list转换为json失败的原因
2013/12/17 Javascript
Windows系统中安装nodejs图文教程
2015/02/28 NodeJs
javascript日期验证之输入日期大于等于当前日期
2015/12/13 Javascript
Bootstrap按钮组简单实现代码
2017/03/06 Javascript
原生JS实现的简单轮播图功能【适合新手】
2018/08/17 Javascript
Android 自定义view仿微信相机单击拍照长按录视频按钮
2019/07/19 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
详解Vue中的MVVM原理和实现方法
2020/07/15 Javascript
简明 Python 基础学习教程
2007/02/08 Python
python调用shell的方法
2013/11/20 Python
浅谈Python单向链表的实现
2015/12/24 Python
解决pycharm运行时interpreter为空的问题
2018/10/29 Python
TensorFLow 数学运算的示例代码
2020/04/21 Python
python中sympy库求常微分方程的用法
2020/04/28 Python
PyQt5实现登录页面
2020/05/30 Python
keras 获取某层的输入/输出 tensor 尺寸操作
2020/06/10 Python
HTML5 Canvas 实现K线图的示例代码
2019/12/23 HTML / CSS
私有程序集与共享程序集有什么区别
2013/04/05 面试题
工程造价管理专业大专生求职信
2013/10/06 职场文书
葡萄牙语专业个人求职信
2013/12/10 职场文书
新农村建设汇报材料
2014/08/15 职场文书
2014年卫生工作总结
2014/11/27 职场文书
考研复习计划
2015/01/19 职场文书
绍兴鲁迅故居导游词
2015/02/09 职场文书
2015年小学语文工作总结
2015/05/25 职场文书
学历证明样本
2015/06/16 职场文书
七夕情人节问候语
2015/11/11 职场文书
【D4DJ】美少女DJ企划 动画将于明年冬季开播第2季
2022/04/11 日漫