详解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模块之StringIO使用示例
Apr 08 Python
python获取当前用户的主目录路径方法(推荐)
Jan 12 Python
使用 Python 实现微信群友统计器的思路详解
Sep 26 Python
Python+opencv 实现图片文字的分割的方法示例
Jul 04 Python
Python matplotlib绘制饼状图功能示例
Sep 10 Python
python 字符串常用函数详解
Sep 11 Python
python给图像加上mask,并提取mask区域实例
Jan 19 Python
GDAL 矢量属性数据修改方式(python)
Mar 10 Python
在脚本中单独使用django的ORM模型详解
Apr 01 Python
Python发送邮件封装实现过程详解
May 09 Python
Python基于codecs模块实现文件读写案例解析
May 11 Python
使用Python实现将多表分批次从数据库导出到Excel
May 15 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 mysql与mysqli事务使用说明 分享
2013/08/17 PHP
php上传图片获取路径及给表单字段赋值的方法
2016/01/23 PHP
php用户登录之cookie信息安全分析
2016/05/13 PHP
Yii视图操作之自定义分页实现方法
2016/07/14 PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
2018/08/04 PHP
javascript常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异
2010/12/25 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
Javascript检查图片大小不要让大图片撑破页面
2014/11/04 Javascript
jquery的checkbox,radio,select等方法小结
2016/08/30 Javascript
jQuery实现节点的追加、替换、删除、复制功能示例
2017/07/11 jQuery
基于js文件加载优化(详解)
2018/01/03 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
jQuery实现表单动态添加与删除数据操作示例
2018/07/03 jQuery
vue项目设置scrollTop不起作用(总结)
2018/12/21 Javascript
解决vue+webpack项目接口跨域出现的问题
2020/08/10 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
python处理中文编码和判断编码示例
2014/02/26 Python
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
python爬取淘宝商品销量信息
2018/11/16 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
2019/08/29 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
2020/04/23 Python
django 解决扩展自带User表遇到的问题
2020/05/14 Python
python实现计算图形面积
2021/02/22 Python
韩国三星集团旗下时尚品牌官网:SSF SHOP
2016/08/02 全球购物
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
大学生求职中的自我评价
2013/10/01 职场文书
村官工作鉴定评语
2014/01/27 职场文书
乡镇干部先进事迹材料
2014/02/03 职场文书
应届生面试求职信
2014/07/02 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers