python实现超时退出的三种方式总结
作者:Noah1995 发布时间:2023-07-22 17:56:34
标签:python,超时,退出
基于signal模块实现
signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂停并等待信号,以及定时发出SIGALRM等。
要注意,signal包主要是针对UNIX平台(比如Linux, MAC OS),而Windows内核中由于对信号机制的支持不充分,所以在Windows上的Python不能发挥信号系统的功能。
# coding:utf8
import time
import signal
# 自定义超时异常
class TimeoutError(Exception):
def __init__(self, msg):
super(TimeoutError, self).__init__()
self.msg = msg
def time_out(interval, callback):
def decorator(func):
def handler(signum, frame):
raise TimeoutError("run func timeout")
def wrapper(*args, **kwargs):
try:
signal.signal(signal.SIGALRM, handler)
signal.alarm(interval) # interval秒后向进程发送SIGALRM信号
result = func(*args, **kwargs)
signal.alarm(0) # 函数在规定时间执行完后关闭alarm闹钟
return result
except TimeoutError, e:
callback(e)
return wrapper
return decorator
def timeout_callback(e):
print(e.msg)
@time_out(2, timeout_callback)
def task1():
print("task1 start")
time.sleep(3)
print("task1 end")
@time_out(2, timeout_callback)
def task2():
print("task2 start")
time.sleep(1)
print("task2 end")
if __name__ == "__main__":
task1()
task2()
输出:
task1 start
run func timeout
task2 start
task2 end
基于子线程阻塞实现超时
# coding:utf8
import time
import threading
def callback_func():
print('超时回调')
def time_out(interval, callback=None):
def decorator(func):
def wrapper(*args, **kwargs):
t =threading.Thread(target=func, args=args, kwargs=kwargs)
t.setDaemon(True) # 设置主线程技术子线程立刻结束
t.start()
t.join(interval) # 主线程阻塞等待interval秒
if t.is_alive() and callback:
return threading.Timer(0, callback).start() # 立即执行回调函数
else:
return
return wrapper
return decorator
@time_out(2, callback_func)
def task3(hh):
print('**********task3****************')
for i in range(3):
time.sleep(1)
print(i)
print(hh)
@time_out(2, callback_func)
def task4(hh):
print('**********task4****************')
for i in range(3):
# time.sleep(1)
print(i)
print(hh)
if __name__ == '__main__':
task3('参数')
task4('参数')
输出:
**********task3****************
0
参数
1
参数
超时回调
**********task4****************
0
参数
1
参数
2
参数
基于协程实现
def callback_func():
print('callback')
def time_out(interval, callback=None):
def decorator(func):
def wrapper(*args, **kwargs):
########## 该部分必选在requests之前导入
import gevent
from gevent import monkey
monkey.patch_all()
##########
try:
gevent.with_timeout(interval, func, *args, **kwargs)
except gevent.timeout.Timeout as e:
callback() if callback else None
return wrapper
return decorator
@time_out(3, callback_func)
def func(a, b):
import time
time.sleep(2)
print(a,b)
func(1, 2)
来源:https://blog.csdn.net/weixin_42368421/article/details/101354628


猜你喜欢
- optim 的基本使用for do:1. 计算loss2. 清空梯度3. 反传梯度4. 更新参数optim的完整流程cifiron = nn
- 404页面对于站长来说应该并不陌生,其作用无碍乎二点:提高用户体验和增强对搜索引擎的友好性。去年在跟几个朋友在聊天的时候,跟我说404页面不
- 本文实例讲述了python提取页面内url列表的方法。分享给大家供大家参考。具体实现方法如下:from bs4 import Beautif
- js 读取csv内容拼接成jsonformdata对象上传了csv文件,读取文件内容拼接成json对象var form = new Form
- 前言这是一个轮子。大家都知道 Ansible 是功能超级强大的自动化运维工具,十分的高大上。太高大上了以至于在低端运维有点水土不服,在于三点
- IN为什么慢?在应用程序中使用子查询后,SQL语句的查询性能变得非常糟糕。例如:SELECT driver_id FROM driver w
- 记录一下Linux虚拟机下MySQL安装配置方法一、 下载mysql5.7http://mirrors.sohu.com/mysql/MyS
- 报错信息应该是这样的webpackEmptyContext (eval at ./src/store/modules sync recurs
- 在Python中,当我们有两个字典需要合并的时候,可以使用字典的 update 方法,例如:a = {'a': 1,
- 本文实例讲述了Python基于回溯法子集树模板解决马踏棋盘问题。分享给大家供大家参考,具体如下:问题将马放到国际象棋的8*8棋盘board上
- 1、异常简介从软件方面来说,错误是语法或是逻辑上的,当python检测到一个错误时,解释器就会指出当前流已经无法继续执行下去,这时候就出现了
- 如何用python做后端写网页-flask框架 什么是Flask安装flask模块Hello World更深一步:数据绑定后端传入数据从前端
- 这篇文章主要介绍了python实现简单日志记录库glog的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 区别IE6与FF:background:orange;*background:blue;区别IE6与IE7:background:green
- 本文实例讲述了symfony2.4的twig中date用法。分享给大家供大家参考,具体如下:获得当前时间:{{ "now"
- 通过观察执行计划,发现之前的执行计划在很多大表连接的部分使用了Hash Join,由于涉及的表中数据众多,因此查询优化器选择使用并行执行,速
- 使用字符串建立查询能加快服务器的解析速度吗?我记的在那儿看过,好像是说使用字符串建立SQL查询是有它的道理的,像这样:<%mySQL=
- 1分钟快速生成用于网页内容提取的xslt,具体内容如下1、项目背景在《Python即时网络爬虫项目说明》一文我们说过要做一个通用的网络爬虫,
- 请定义函数,将列表[10, 1, 2, 20, 10, 3, 2, 1, 15, 20, 44, 56, 3, 2, 1]中的重复元素除去,
- 我一般都是通过xpath解析DOM树的时候会使用lxml的etree,可以很方便的从html源码中得到自己想要的内容。这里主要介绍一下我常用