最近在项目中调用第三方接口时候,经常会出现请求超时的情况,或者参数的问题导致调用异代码异常。针对超时异常,查询了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 的异常
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]