详解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实现爬取逐浪小说的方法
Jul 07 Python
python动态加载包的方法小结
Apr 18 Python
OpenCV实现人脸识别
Apr 07 Python
python爬虫之BeautifulSoup 使用select方法详解
Oct 23 Python
tensorflow实现对图片的读取的示例代码
Feb 12 Python
python集合常见运算案例解析
Oct 17 Python
python实现通过队列完成进程间的多任务功能示例
Oct 28 Python
python列表生成器迭代器实例解析
Dec 19 Python
python图形开发GUI库wxpython使用方法详解
Feb 14 Python
在python3中实现查找数组中最接近与某值的元素操作
Feb 29 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
Apr 22 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
Sep 01 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 在线打包_支持子目录
2008/06/28 PHP
fleaphp下不确定的多条件查询的巧妙解决方法
2008/09/11 PHP
解析dedeCMS验证码的实现代码
2013/06/07 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
2016/12/28 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
详解PHP 二维数组排序保持键名不变
2019/03/06 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
2019/12/11 PHP
JavaScript 设计模式学习 Singleton
2009/07/27 Javascript
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
2012/07/20 Javascript
原生javascript实现无间缝滚动示例
2014/01/28 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
C++中的string类的用法小结
2015/08/07 Javascript
微信小程序 前端源码逻辑和工作流详解
2016/10/08 Javascript
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
2018/05/15 NodeJs
this.$toast() 了解一下?
2019/04/18 Javascript
解决vue-router路由拦截造成死循环问题
2020/08/05 Javascript
[54:51]Ti4 冒泡赛第二轮LGD vs C9 3
2014/07/14 DOTA
[01:35]辉夜杯战队访谈宣传片—LGD
2015/12/25 DOTA
python多线程操作实例
2014/11/21 Python
Python类的用法实例浅析
2015/05/27 Python
python RabbitMQ 使用详细介绍(小结)
2018/11/08 Python
Python中的asyncio代码详解
2019/06/10 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
新手如何发布Python项目开源包过程详解
2019/07/11 Python
python super的使用方法及实例详解
2019/09/25 Python
Python API自动化框架总结
2019/11/12 Python
Pytorch .pth权重文件的使用解析
2020/02/14 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
法国房车租赁网站:Yescapa
2019/08/26 全球购物
标记环介质访问控制协议
2016/03/27 面试题
JAVA高级程序员面试题
2013/09/06 面试题
中学生打架检讨书
2014/10/13 职场文书
老人节主持词
2015/07/04 职场文书
2016年公务员六五普法心得体会
2016/01/21 职场文书
SpringCloud Function SpEL注入漏洞分析及环境搭建
2022/04/08 Java/Android