详解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中的__init__和__new__
Mar 12 Python
python使用正则表达式提取网页URL的方法
May 26 Python
浅谈python新手中常见的疑惑及解答
Jun 14 Python
Pycharm远程调试openstack的方法
Nov 21 Python
对Python 获取类的成员变量及临时变量的方法详解
Jan 22 Python
python3调用windows dos命令的例子
Aug 14 Python
Django使用中间件解决前后端同源策略问题
Sep 02 Python
基于python实现雪花算法过程详解
Nov 16 Python
Python内置加密模块用法解析
Nov 25 Python
Python函数的定义方式与函数参数问题实例分析
Dec 26 Python
python__new__内置静态方法使用解析
Jan 07 Python
python中的class_static的@classmethod的巧妙用法
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单例模式实现(对象只被创建一次)
2012/12/05 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
2019/08/05 PHP
jquery 笔记 事件
2011/11/02 Javascript
jquery更换文章内容与改变字体大小代码
2013/09/30 Javascript
JS实现弹性菜单效果代码
2015/09/07 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
浅谈js中的变量名和函数名重名
2017/02/13 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
2017/12/15 Javascript
vue click.stop阻止点击事件继续传播的方法
2018/09/04 Javascript
小程序接口的promise化的实现方法
2019/12/11 Javascript
js实现点赞按钮功能的实例代码
2020/03/06 Javascript
使用eslint和githooks统一前端风格的技巧
2020/07/29 Javascript
[56:46]Liquid vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[04:32]玩具屠夫中文语音节选
2020/08/23 DOTA
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
python调试神器PySnooper的使用
2019/07/03 Python
python单例模式的多种实现方法
2019/07/26 Python
Python字符串的修改方法实例
2019/12/19 Python
Python过滤掉numpy.array中非nan数据实例
2020/06/08 Python
Python如何将装饰器定义为类
2020/07/30 Python
Pycharm新手使用教程(图文详解)
2020/09/17 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
2020/12/29 Python
10种CSS3实现的loading动画,挑一个走吧?
2020/11/16 HTML / CSS
英国最大的经认证的有机超市:Planet Organic
2018/02/02 全球购物
使用索引有什么好处
2016/07/27 面试题
私有程序集与共享程序集有什么区别
2013/04/05 面试题
新学期校长寄语
2014/01/18 职场文书
十八大报告观后感
2014/01/28 职场文书
情人节活动策划方案
2014/02/27 职场文书
开发房地产协议书
2014/09/14 职场文书
学校党委干部个人对照检查材料思想汇报
2014/10/09 职场文书
离婚起诉书范本
2015/05/18 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书
Python爬虫之爬取哔哩哔哩热门视频排行榜
2021/04/28 Python