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

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

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

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

在公众号前几天的文章中,我们介绍了使用signal来接管键盘的中断信号,用到的是 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('该函数运行超时,运行自定义的处理流程')

当然你如果想直接跳过这个异常也没问题:

import contextlib:

with contextlib.supress(FuncTimeException):

clac_statistic(100)

总结

以上所述是小编给大家介绍的在 Linux/Mac 下为Python函数添加超时时间的方法,希望对大家有所帮助,也非常感谢大家对我们网站的支持!

本文标题: 在 Linux/Mac 下为Python函数添加超时时间的方法

本文地址: http://www.cppcns.com/jiaoben/python/301011.html

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

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

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

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

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

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

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

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

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

  5. python如何将列表去掉引号_如何将手机打造成 Python 开发利器?

    相信多数安卓用户都使用过Qpython这款移动端的Python编辑器吧?之前我也研究过一阵子这个工具,但因为一次简单的爬虫让我对它失望之极.Qpython不支持lxml这个模块,然而python中lx ...

  6. 删除虚拟环境_手把手教你在Linux系统下使用Python虚拟环境

    Hello小伙伴们,你们好,又是日常get新技能的一天,今天,咱们来整一下如何玩转Linux下Python虚拟环境,0基础入门,趁着热乎,快上车啦~. 之前小编有写过Windows下的虚拟环境创建和基 ...

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

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

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

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

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

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

最新文章

  1. java公寓管理系统设计与实现_学生公寓(宿舍)管理系统的设计与实现(论文范文, jspjava).docx_蚂蚁文库...
  2. C++和C语言中enum 如何使用
  3. 在全局中谋一域_谋全局才能谋一域
  4. Python 常用系统模块整理
  5. 算法竞赛进阶指南——后缀数组
  6. 【渝粤题库】陕西师范大学210029 幼儿园游戏(学前儿童游戏)作业
  7. 微软超过苹果 成为全球第一大市值公司
  8. linux网站目录在哪_果核建站教程【二】环境安装与搭建第一个网站
  9. Spring中Aware的用法以及实现
  10. 虚拟机安装centos7后无法联网
  11. wxPython利用pytesser模块实现图片文字识别
  12. C#读取MP3文件的专辑图片和ID3V2Tag信息(带代码)
  13. Java Attach机制
  14. 日立6TB充氦硬盘详细规格、实物照片
  15. python计算方差膨胀因子_可决系数R^2和方差膨胀因子VIF
  16. Hadoop配置lzo
  17. 怎么检测计算机硬件好坏,鲁大师如何检测硬件好坏?硬件好坏检测方法介绍
  18. Docker 部署SpringBoot应用
  19. 图论(一)--基础概念
  20. [Kubic] Lines

热门文章

  1. 针对 easyui boolean 布尔值 的处理
  2. 小游戏来了 游戏小程序你想知道的这有
  3. robotframework手机号随机产生脚本
  4. 终于写了自己第一个有些用处的代码,留念留念,是模糊搜索并复制到指定文件夹...
  5. NeHe OpenGL教程 第四十七课:CG顶点脚本
  6. 合成存储方法,局部/全局变量
  7. Windows下sc create命令行添加/创建/修改服务
  8. spring的有状态BEAN和无状态BEAN
  9. Linux Versus Windows, Ubuntu/Mint V XP/Vista/7
  10. 【转】Photoshop网站设计:DesignStudio