详解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的chardet库获得文件编码并修改编码
Jan 22 Python
Python Deque 模块使用详解
Jul 04 Python
Python中多线程thread与threading的实现方法
Aug 18 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
Aug 30 Python
浅谈Python处理PDF的方法
Nov 10 Python
网红编程语言Python将纳入高考你怎么看?
Jun 07 Python
Python使用sklearn实现的各种回归算法示例
Jul 04 Python
Python 依赖库太多了该如何管理
Nov 08 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
May 26 Python
Python 连接 MySQL 的几种方法
Sep 09 Python
Python如何获取文件路径/目录
Sep 22 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
Mar 03 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
模仿OSO的论坛(五)
2006/10/09 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
2019/10/11 PHP
javascript innerHTML、outerHTML、innerText、outerText的区别
2008/11/24 Javascript
jquery控制listbox中项的移动并排序
2009/11/12 Javascript
扩展javascript的Date方法实现代码(prototype)
2010/11/20 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
jQuery中选择器小问题(新人难免遇到)
2014/03/31 Javascript
Bootstrap响应式表格详解
2017/05/23 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
React-Native中禁用Navigator手势返回的示例代码
2017/09/09 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
2018/08/13 Javascript
基于AngularJs select绑定数字类型的问题
2018/10/08 Javascript
详解Vue-axios 设置请求头问题
2018/12/06 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
区分vue-router的hash和history模式
2020/10/03 Javascript
python爬虫教程之爬取百度贴吧并下载的示例
2014/03/07 Python
在Python中使用mongoengine操作MongoDB教程
2015/04/24 Python
Python保存MongoDB上的文件到本地的方法
2016/03/16 Python
详解python进行mp3格式判断
2016/12/23 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
Python 的 f-string 可以连接字符串与数字的原因解析
2021/02/20 Python
HTML5 MiranaVideo播放器 (代码开源)
2010/06/11 HTML / CSS
recorder.js 基于Html5录音功能的实现
2020/05/26 HTML / CSS
美国豪华的多品牌精品店:The Webster
2019/07/31 全球购物
如何将整数int转换成字串String
2014/03/21 面试题
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
小学毕业感言50字
2014/02/16 职场文书
党员四风自我剖析材料思想汇报
2014/09/13 职场文书
计算机实训报告范文
2014/11/05 职场文书
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang
Java生成日期时间存入Mysql数据库的实现方法
2022/03/03 Java/Android
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android
tree shaking对打包体积优化及作用
2022/07/07 Java/Android