在 Linux/Mac 下为Python函数添加超时时间

收录于话题

#你不知道的 Python

71个

摄影:产品经理

产品经理亲自下厨

我们在使用 requests 这类网络请求第三方库时,可以看到它有一个参数叫做timeout,就是指在网络请求发出开始计算,如果超过 timeout 还没有收到返回,就抛出超时异常。(当然存在特殊情况timeout 会失效,请看Timeouts and cancellation for humans*[1] 这篇文章中作者的举例,我们不考虑这种特殊情况)。

但大家有没有考虑过,如何为普通的函数设置超时时间?特别是在运行一些数据处理、AI 相关的代码时,某个函数可能会运行很长时间,我们想实现,在函数运行超过特定的时间时,自动报错。

例如有这样一个场景,我写了一个函数calc_statistic(datas),根据用户传入的数据计算某个值。但如果用户传入的数据非常大,这个函数就可能运行很长时间。我想设置让这个函数最多运行10秒钟。如果10秒还没有运行完成,就报错。应该怎么办呢?

如果你的电脑操作系统是 Linux 或者 macOS,那么 可以使用 signal 来解决。

在公众号前几天的文章中,我们介绍了使用signal来接管键盘的中断信号:《一日一技:在 Python 中接管键盘中断信号》,用到的是signal.SIGINT。今天我们要用到的是signal.SIGALRM。

首先我们来看看这个信号的使用方法:

import time

import signal

def handler(signum, _): print('定时到!') raise Exception('定时到了!')

def clac_statistic(datas): time.sleep(100)

signal.signal(signal.SIGALRM, handler)

signal.alarm(5)

clac_statistic('xxx')

运行效果如下图所示:

首先绑定signal.SIGALRM事件到handler函数中,然后使用signal.alarm(10)延迟10秒发送一个信号。10秒到了以后,函数handler被运行。在函数中抛出了一个异常,导致程序结束。clac_statistic函数原本要运行100秒,但是在10秒以后就停止了,从而实现了函数的超时功能。

基于以上原理,我们实现一个装饰器,来简化为不同函数设置超时功能:

import time

import signal

class FuncTimeoutException(Exception): pass

def handler(signum, _): raise FuncTimeoutException('函数定时到了!')

def func_timeout(times=0): def decorator(func): if not times: return func def wraps(*args, **kwargs): signal.alarm(times) result = func(*args, **kwargs) signal.alarm(0) # 函数提前运行完成,取消信号 return result return wraps return decorator

signal.signal(signal.SIGALRM, handler)

我们来试一试测试一下这个函数超时装饰器。首先测试函数的运行时间小于超时时间时,程序正常运行没有问题:

再来测试一下函数运行时间超过超时时间的情况:

正常抛出FuncTimeoutException异常。

那我们在实际使用中,可以使用try...except FuncTimeoutException捕获这个异常,然后实现自定义的处理流程,例如:

try: clac_statistic(100)

except FuncTimeException: print('该函数运行超时,运行自定义的处理流程')

当然你如果想直接跳过这个异常也没问题,参考《一日一技:不使用 try...except 掩盖一些已知异常》:

import contextlib:

with contextlib.supress(FuncTimeException): clac_statistic(100)

参考资料

kingname

攒钱给产品经理买房。

文章来源: blog.51cto.com,作者:未闻Code,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.51cto.com/15023263/2558769

python给函数设置超时时间已到_在 Linux/Mac 下为Python函数添加超时时间相关推荐

  1. python给函数设置超时时间_在 Linux/Mac 下为Python函数添加超时时间的方法

    我们在使用 requests 这类网络请求第三方库时,可以看到它有一个参数叫做 timeout ,就是指在网络请求发出开始计算,如果超过 timeout 还没有收到返回,就抛出超时异常.(当然存在特殊 ...

  2. python给函数设置超时时间_在 Linux/Mac 下为Python函数添加超时时间

    我们在使用 requests 这类网络请求第三方库时,可以看到它有一个参数叫做timeout,就是指在网络请求发出开始计算,如果超过 timeout 还没有收到返回,就抛出超时异常.(当然存在特殊情况 ...

  3. Linux超时时间为0,在 Linux/Mac 下为Python函数添加超时时间

    在 Linux/Mac 下为Python函数添加超时时间 收录于话题 #你不知道的 Python 71个 摄影:产品经理 产品经理亲自下厨 我们在使用 requests 这类网络请求第三方库时,可以看 ...

  4. 苹果系统安装python环境_如何在mac下配置python虚拟环境

    安装python虚拟环境核心目的就是为了复制一个python环境,这样新项目下载的所有包,都会存放在虚拟环境下的python site-package 中 首先安装 1. sudo pip insta ...

  5. linux部署python web项目 详细_在linux服务器下部署python工程(爬虫)

    ---恢复内容开始--- 这两天 部署 这个 工程 ,真的是 心力交瘁惹. 如果有用到爬虫的话,python环境 先配好,如果是 python3的话 beautifulsoup 可以参见 http:/ ...

  6. mac下的python程序使用pyinstall打包

    mac下的python程序使用pyinstaller 打包注意事项 一.pyinstaller 打包特别注意事项: 注释掉程序里面的所有pirnt(),否则会会引起程序无法运行或崩溃. 二.pyins ...

  7. C++在linux环境下获取毫秒、微妙级别时间

                    C++在linux环境下获取毫秒.微妙级别时间 一.时间单位简介:     1秒  = 1000毫秒     1秒  = 1000000微秒     1秒  = 100 ...

  8. linux系统下对python创建的模块进行打包并发布的具体步骤

    之前在前面的 Python的模块与包 文章中具体的介绍了模块,也介绍了模块创建与发布的步骤. 文章地址:https://blog.csdn.net/Mr_fengzi/article/details/ ...

  9. linux下的python安装,linux环境下的python安装过程

    一.下载python源码包 打开ubuntu下的shell终端,通过wget命令下载python源码包,如下图所示: wget https://www.python.org/ftp/python/3. ...

  10. 手把手教你在Linux系统下进行Python pip换源操作

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 世间无限丹青手,一片伤心画不成. ...

最新文章

  1. javascript简单应用
  2. 基本响应性的Web设计测试工具
  3. 美图秀秀首页界面按钮设计(二)
  4. 数据可视化及其重要性:Python
  5. rm: 无法删除swap: 不允许的操作_safe-rm老板再也不用担心我删库跑路啦[视频]
  6. 只考计算机知识吗,计算机二级只考一门吗?计算机二级考什么?
  7. 如何写一个不带BOM的UTF8文件
  8. Zookeeper Python
  9. python获取当前线程_Python爬虫(线程,进程)
  10. 精选32个最新Python实战项目(附源码),拿走就用
  11. 单片机控制直流电机正反转
  12. SpringBoot实现quartz定时任务可视化管理
  13. 从认知负荷理论看语音交互设计
  14. matlab floor函数用法,matlab中fix, floor, ceil, round 函数的使用方法
  15. 通常所说的微型计算机主机主要包括,通常所说的微型计算机的主机主要包括( )。...
  16. 学会这些方法,扩展磁盘分区还不是轻轻松松?
  17. VC++图像加密软件设计与实现
  18. Altium Designer原理图转OrCAD原理图方法
  19. DevOps教程:DevOps 工具
  20. 有没有测试游戏天赋的软件,测测你的电竞天赋-测测你的电竞天赋有多高小游戏v1.0...

热门文章

  1. GitHub 桌面版 v3.0 新特性「GitHub 热点速览 v.22.18」
  2. 微软Media Creation Tool 创建工具 1.3 升级:支持全新下载安装Win11 22H2 Build 22621.525
  3. eclipse 连 mysql 数据库 jdbc下载
  4. 很无聊但是又很重要的 计算机网络基础知识 ---“互联网协议“
  5. SANYUKI:净化空气,顺便美颜?
  6. AI为传统零售行业赋能,自助收银推动无人零售发展
  7. 董付国python题库_1000道Python题库系列分享四(40道)
  8. 在线字体文件转换工具(.ttf/.otf/.woff/.woff2文件在线转换)
  9. k3 lede刷官改_斐讯K3路由LEDE固件刷回官方原版固件
  10. 使用 Transmission 制作种子命令