详解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入门篇之字典
Oct 17 Python
Python3.x版本中新的字符串格式化方法
Apr 24 Python
python 3利用BeautifulSoup抓取div标签的方法示例
May 28 Python
用pandas按列合并两个文件的实例
Apr 12 Python
python smtplib模块自动收发邮件功能(一)
May 22 Python
python 文件查找及内容匹配方法
Oct 25 Python
为什么黑客都用python(123个黑客必备的Python工具)
Jan 31 Python
Django 拼接两个queryset 或是两个不可以相加的对象实例
Mar 28 Python
pycharm 2018 激活码及破解补丁激活方式
Sep 21 Python
python如何进行矩阵运算
Jun 05 Python
什么是python类属性
Jun 10 Python
新手学python应该下哪个版本
Jun 11 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/11/26 PHP
PHP程序员最常犯的11个MySQL错误小结
2010/11/20 PHP
php通过array_push()函数添加多个变量到数组末尾的方法
2015/03/18 PHP
php生成数字字母的验证码图片
2015/07/14 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
PHP数组常用函数实例小结
2018/08/20 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
2011/02/14 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
JavaScript中pop()方法的使用教程
2015/06/09 Javascript
jQuery编写textarea输入字数限制代码
2017/03/23 jQuery
Angular.js实现动态加载组件详解
2017/05/28 Javascript
Javascript实现找不同色块的游戏
2017/07/17 Javascript
Vue 创建组件的两种方法小结(必看)
2018/02/23 Javascript
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
2019/07/29 Javascript
vue 项目@change多个参数传值多个事件的操作
2021/01/29 Vue.js
python的re正则表达式实例代码
2018/01/24 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
Python清空文件并替换内容的实例
2018/10/22 Python
Python遍历文件夹 处理json文件的方法
2019/01/22 Python
python 将日期戳(五位数时间)转换为标准时间
2019/07/11 Python
Python识别快递条形码及Tesseract-OCR使用详解
2019/07/15 Python
Html5定位终极解决方案
2020/02/05 HTML / CSS
DeinDesign德国:设计自己的手机壳
2019/12/14 全球购物
学雷锋志愿者活动方案
2014/08/21 职场文书
城市轨道交通工程职业生涯规划书范文
2014/09/16 职场文书
2014年妇幼卫生工作总结
2014/12/09 职场文书
2015年学校食堂工作总结
2015/04/22 职场文书
同事打架检讨书
2015/05/06 职场文书
2015年七年级班主任工作总结
2015/05/21 职场文书
大学运动会通讯稿
2015/07/18 职场文书
golang判断key是否在map中的代码
2021/04/24 Golang
Pandas加速代码之避免使用for循环
2021/05/30 Python
使用Djongo模块在Django中使用MongoDB数据库
2021/06/20 Python