详解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 09 Python
用Python的Django框架完成视频处理任务的教程
Apr 02 Python
Python实现把xml或xsl转换为html格式
Apr 08 Python
python列出目录下指定文件与子目录的方法
Jul 03 Python
Python中列表和元组的相关语句和方法讲解
Aug 20 Python
python利用socketserver实现并发套接字功能
Jan 26 Python
Python实现ping指定IP的示例
Jun 04 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
Jan 15 Python
详解用python自制微信机器人,定时发送天气预报
Mar 25 Python
详解Python爬取并下载《电影天堂》3千多部电影
Apr 26 Python
通过Python pyecharts输出保存图片代码实例
Nov 25 Python
Python中的协程(Coroutine)操作模块(greenlet、gevent)
May 30 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
乱谈我对耳机、音箱的感受
2021/03/02 无线电
CI框架学习笔记(二) -入口文件index.php
2014/10/27 PHP
PHP程序员必须清楚的问题汇总
2014/12/18 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
PHP简单实现冒泡排序的方法
2016/12/26 PHP
用js做一个小游戏平台 (一)
2009/12/29 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
jQuery+easyui中的combobox实现下拉框特效
2015/02/27 Javascript
15位和18位身份证JS校验的简单实例
2016/07/18 Javascript
javascript跨域请求包装函数与用法示例
2016/11/03 Javascript
vue实现简单实时汇率计算功能
2017/01/15 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
js链表操作(实例讲解)
2017/08/29 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
js模拟实现烟花特效
2020/03/10 Javascript
[02:03]DOTA2亚洲邀请赛 HGT战队出场宣传片
2015/02/07 DOTA
Python实现将目录中TXT合并成一个大TXT文件的方法
2015/07/15 Python
python实现简单爬虫功能的示例
2016/10/24 Python
利用python打印出菱形、三角形以及矩形的方法实例
2017/08/08 Python
python判断文件夹内是否存在指定后缀文件的实例
2019/06/10 Python
Python分类测试代码实例汇总
2020/07/23 Python
Python map及filter函数使用方法解析
2020/08/06 Python
Python通过字典映射函数实现switch
2020/11/06 Python
python中pop()函数的语法与实例
2020/12/01 Python
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
应届毕业生专业个人求职自荐信格式
2013/11/20 职场文书
会计自荐书
2013/12/02 职场文书
小学语文国培感言
2014/03/04 职场文书
幼儿园小班植树节活动方案
2014/03/04 职场文书
食堂标语大全
2014/06/11 职场文书
低碳环保标语
2014/06/12 职场文书
大学毕业生管理学求职信
2014/09/01 职场文书
导航工程专业自荐信
2014/09/02 职场文书
学习党章心得体会2016
2016/01/15 职场文书
css position fixed 左右双定位的实现代码
2021/04/29 HTML / CSS
MYSQL常用函数介绍
2022/05/05 MySQL