详解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 相关文章推荐
50行代码实现贪吃蛇(具体思路及代码)
Apr 27 Python
python自动化测试实例解析
Sep 28 Python
11个并不被常用但对开发非常有帮助的Python库
Mar 31 Python
Python实现的数据结构与算法之链表详解
Apr 22 Python
给你选择Python语言实现机器学习算法的三大理由
Nov 15 Python
python字符串循环左移
Mar 08 Python
详解python--模拟轮盘抽奖游戏
Apr 12 Python
python算法与数据结构之冒泡排序实例详解
Jun 22 Python
在python中创建指定大小的多维数组方式
Nov 28 Python
python内置模块collections知识点总结
Dec 19 Python
python 轮询执行某函数的2种方式
May 03 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 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 进度条实现代码
2009/03/10 PHP
基于php split()函数的用法详解
2013/06/05 PHP
利用PHP实现短域名互转
2013/07/05 PHP
Yii框架调试心得--在页面输出执行sql语句
2014/12/25 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
php array 转json及java 转换 json数据格式操作示例
2019/11/13 PHP
Javascript Cookie读写删除操作的函数
2010/03/02 Javascript
javascript中的对象创建 实例附注释
2011/02/08 Javascript
JavaScript的jQuery库中function的存在和参数问题
2015/08/13 Javascript
JS+CSS实现的经典tab选项卡效果代码
2015/09/16 Javascript
jQuery事件委托之Safari
2016/07/05 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
2016/10/24 Javascript
js选项卡的制作方法
2017/01/23 Javascript
NodeJs安装npm包一直失败的解决方法
2017/04/28 NodeJs
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
vue打包相关细节整理(小结)
2018/09/28 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
webpack4 从零学习常用配置(小结)
2019/05/28 Javascript
bootstrap+spring boot实现面包屑导航功能(前端代码)
2019/10/09 Javascript
ES6 proxy和reflect的使用方法与应用实例分析
2020/02/15 Javascript
手机浏览器唤起微信分享(JS)
2020/10/11 Javascript
Python中使用partial改变方法默认参数实例
2015/04/28 Python
利用Python将文本中的中英文分离方法
2018/10/31 Python
Python从Excel中读取日期一列的方法
2018/11/28 Python
Django集成celery发送异步邮件实例
2019/12/17 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
2020/01/06 Python
tensorflow 实现自定义layer并添加到计算图中
2020/02/04 Python
python操作redis数据库的三种方法
2020/09/10 Python
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
英国知名化妆品网站:Revolution Beauty(原TAM Beauty)
2018/02/28 全球购物
运动会获奖感言
2014/02/11 职场文书
六五普法规划实施方案
2014/03/21 职场文书
乡镇干部个人对照检查材料(群众路线)
2014/09/26 职场文书
职工食堂管理制度
2015/08/06 职场文书
小学作文指导之如何写人?
2019/07/08 职场文书
深入理解pytorch库的dockerfile
2022/06/10 Python