详解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 深入理解yield
Sep 06 Python
Python实现简单截取中文字符串的方法
Jun 15 Python
Ruby元编程基础学习笔记整理
Jul 02 Python
Python处理XML格式数据的方法详解
Mar 21 Python
关于python的list相关知识(推荐)
Aug 30 Python
python命令行参数用法实例分析
Jun 25 Python
django ManyToManyField多对多关系的实例详解
Aug 09 Python
python 多进程共享全局变量之Manager()详解
Aug 15 Python
利用rest framework搭建Django API过程解析
Aug 31 Python
深入浅析Python代码规范性检测
Jul 31 Python
python中time.ctime()实例用法
Feb 03 Python
python实现简单的名片管理系统
Apr 26 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 empty函数判断mysql表单是否为空
2010/04/12 PHP
thinkPHP的表达式查询用法详解
2016/09/14 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
2016/11/14 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
2017/11/21 PHP
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
document.getElementById获取控件对象为空的解决方法
2013/11/20 Javascript
每天一篇javascript学习小结(Date对象)
2015/11/13 Javascript
JavaScript省市区三级联动菜单效果
2016/09/21 Javascript
解决webpack打包速度慢的解决办法汇总
2017/07/06 Javascript
vue用addRoutes实现动态路由的示例
2017/09/15 Javascript
Parcel 打包示例(React HelloWorld)
2018/01/16 Javascript
JavaScript函数节流和函数去抖知识点学习
2018/07/31 Javascript
解决vue 项目引入字体图标报错、不显示等问题
2018/09/01 Javascript
uniapp实现可滑动选项卡
2020/10/21 Javascript
js中延迟加载和预加载的具体使用
2021/01/14 Javascript
在Python中使用mechanize模块模拟浏览器功能
2015/05/05 Python
Python读取网页内容的方法
2015/07/30 Python
python 读写、创建 文件的方法(必看)
2016/09/12 Python
Python实现快速排序的方法详解
2019/10/25 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
dpn网络的pytorch实现方式
2020/01/14 Python
Python文件读写w+和r+区别解析
2020/03/26 Python
python如何进行矩阵运算
2020/06/05 Python
pandas将list数据拆分成行或列的实现
2020/12/13 Python
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
化工工艺专业求职信
2013/09/22 职场文书
销售行业个人求职自荐信
2013/09/25 职场文书
室内设计专业个人的自我评价
2013/12/18 职场文书
行政文秘岗位职责范本
2014/02/10 职场文书
党的群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
综合素质评价自我评价
2015/03/06 职场文书
宣传稿格式范文
2015/07/23 职场文书
合同范本之电脑出租
2019/08/13 职场文书
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang