详解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中的多行注释文档编写风格汇总
Jun 16 Python
Python使用gRPC传输协议教程
Oct 16 Python
Python3的介绍、安装和命令行的认识(推荐)
Oct 20 Python
为什么你还不懂得怎么使用Python协程
May 13 Python
Python程序打包工具py2exe和PyInstaller详解
Jun 28 Python
Python random模块制作简易的四位数验证码
Feb 01 Python
TensorFlow MNIST手写数据集的实现方法
Feb 05 Python
keras分类模型中的输入数据与标签的维度实例
Jul 03 Python
在pycharm中文件取消用 pytest模式打开的操作
Sep 01 Python
Python tkinter实现日期选择器
Feb 22 Python
用python画城市轮播地图
May 28 Python
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
Jun 22 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开发GUI
2006/10/09 PHP
php删除指定目录的方法
2015/04/03 PHP
smarty高级特性之过滤器的使用方法
2015/12/25 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
微信浏览器内置JavaScript对象WeixinJSBridge使用实例
2015/05/25 Javascript
编写高性能Javascript代码的N条建议
2015/10/12 Javascript
理解JS事件循环
2016/01/07 Javascript
JavaScript File分段上传
2016/03/10 Javascript
AngularJs表单验证实例详解
2016/05/30 Javascript
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
js+html制作简单日历的方法
2017/06/27 Javascript
微信小程序引用iconfont图标的方法
2018/10/22 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS NE
2014/05/22 DOTA
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
numpy中索引和切片详解
2017/12/15 Python
对numpy中shape的深入理解
2018/06/15 Python
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
解析python实现Lasso回归
2019/09/11 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
2019/10/30 Python
python 实现提取log文件中的关键句子,并进行统计分析
2019/12/24 Python
python文件读取失败怎么处理
2020/06/23 Python
canvas环形倒计时组件的示例代码
2018/06/14 HTML / CSS
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
奥地利体育网上商店:Gigasport
2019/10/09 全球购物
通信工程专业女生个人求职信
2013/09/21 职场文书
施工人员岗位职责
2013/12/12 职场文书
打架检讨书2000字
2014/02/22 职场文书
党课知识竞赛主持词
2014/04/01 职场文书
抗洪救灾先进集体事迹材料
2014/05/26 职场文书
人事代理委托书
2014/09/27 职场文书
2014年维修电工工作总结
2014/11/20 职场文书
教师节倡议书2015
2015/04/27 职场文书
运动员加油词
2015/07/18 职场文书