python程序超时处理方式

 更新时间:2023年08月17日 15:10:02   作者:何小义的AI进阶路  
这篇文章主要介绍了python程序超时处理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

python程序超时处理

下面这个小案例,实现对某个函数超时处理:

其实就是加了一个装饰器timeout

import time
import timeout_decorator
@timeout_decorator.timeout(6)
def justtest():
    time.sleep(5)
    return 5
aaa = justtest()
print aaa

上面代码我们规定若函数运行时间超过6s  就报错。

5s是可以的,所以正常运行,运行结果:

如果我们设定程序不可超过3s,

import time
import timeout_decorator
@timeout_decorator.timeout(3)
def justtest():
    time.sleep(5)
    return 5
aaa = justtest()
print aaa

运行结果:

python超时处理方法介绍,Eventlet 和 func-timeout

有一些场景,需要我们控制程序或者脚本的运行时间。 

  • 自动化用例中的某一个步骤需要在规定时间内完成才算有效;    
  • 使用线程池控制线程运行时,我们不希望每个线程运行时间超过某一值;    
  • 在爬虫时发送的request请求,我们希望在规定时间内无响应则跳过该请求;    
  • 当写入了一条错误的sql查询语句可能会导致该查询语句一直运行,导致其他查询语句阻塞时等等场景

以上场景中,如果我们在程序中设置了超时处理,那将会为我们的程序节约很多运行时间。

1.eventlet

安装: 

pip install eventlet

eventlet在代码中的使用:

import time
import eventlet                     # 导入eventlet模块
eventlet.monkey_patch()             # 引入patch
with eventlet.Timeout(3, False):    # 设置超时时间3秒
    time.sleep(4)                   # 等待4秒
    print('结果1')                   # 因为等待了4秒,大于超时时间,所以'结果1‘不打印
print('结果2')
# 运行以上程序输出:
# 结果2
with eventlet.Timeout(3, False):    # 设置超时时间3秒
    time.sleep(2)                   # 等待2秒
    print('结果3')                   # 因为等待了2秒,小于超时时间,所以'结果3‘也会打印
print('结果4')
# 运行以上程序输出:
# 结果3
# 结果4

注意:eventlet方法中只要进行了子进程的调用,超时设置就会失效。示例:

import time
import os
import eventlet                     # 导入eventlet模块
from multiprocessing import Process
def my_test(name):
    print('子进程运行中,name={},pid={}'.format(name, os.getpid()))
    time.sleep(10)
    print('子进程已经结束')
if __name__ == '__main__':
    eventlet.monkey_patch()                                 # 引入patch
    with eventlet.Timeout(3, False):                        # 这里设置了超时时间3
        print('父进程:{}'.format(os.getpid()))
        p = Process(target=my_test, args=('test', ))        # 调用了子进程,子进程内有等待10秒的步骤,等待完才会打印'子进程已经结束‘
        print('子进程准备执行---')
        p.start()
# 执行以上程序输出:
# 父进程:11548
# 子进程准备执行 - --
# 子进程运行中,name = test,pid = 1996
# 子进程已经结束

从以上示例可以看出,设置的超时时间3秒没有生效。这种情况,我们只能将超时处理步骤加到my_test函数中即可:

def my_test(name):
    print('子进程运行中,name={},pid={}'.format(name, os.getpid()))
    eventlet.monkey_patch()                                 # 引入patch
    with eventlet.Timeout(3, False):
        time.sleep(10)
        print('等待时间结束')
    print('子进程已经结束')

2.func-timeout

安装:

pip install func-timeout

func-timeout 在代码中的使用,func-timeout主要有两中方法:func_timeout,func_set_timeout

2.1 func_set_timeout 用法

# func_set_timeout作为装饰器使用,来作为目标函数的超时处理方式
import time
import os
from func_timeout import func_set_timeout
@func_set_timeout(5)
def my_test(name):
    print('子进程运行中,name={},pid={}'.format(name, os.getpid()))
    time.sleep(4)			
    print('子进程已经结束')
if __name__ == '__main__':
    print('父进程:{}'.format(os.getpid()))
    try:
        p = Process(target=my_test, args=('test', ))
        p.start()
    except TimeoutError as e:
        print('子程序超时')
# 执行以上程序输出:
# 父进程:29908
# 结束
# 子进程运行中,name=test,pid=40280
# 子进程已经结束
# 说明:my_test函数执行需要4s,设置的超时时间大于4s,因此子进程正常执行;若设置my_test函数执行时间大于5s,则报错,代码中尝试了通过捕获异常来让程序正常运行退出,但超时异常时发生在子进程中的,因此捕获异常失败,此时的报错见图1。

图1:

2.2 func_timeout 用法

import time
import os
from func_timeout import func_timeout
from func_timeout import FunctionTimedOut
def my_test(name):
    print('进程运行中,name={},pid={}'.format(name, os.getpid()))
    time.sleep(6)
    print('进程已经结束')
if __name__ == '__main__':
    try:
        func_timeout(3, my_test, args=('test', ))
    except FunctionTimedOut as e:
        print(e)
        print('进程运行超时')
# 输出:
# 进程运行中,name=test,pid=3364
# Function my_test (args=('test',)) (kwargs={}) timed out # after 3.000000 seconds.
# 进程运行超时
# 说明:func_timeout()第一个参数为超时时间,第二个参数是调用的函数,注意这里只调用函数名,没有(), 第三个参数是调用函数的参数。这里使用的异常捕获也不能解决2.1中的报错问题。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

相关文章

  • Python自动化办公实战案例详解(Word、Excel、Pdf、Email邮件)

    Python自动化办公实战案例详解(Word、Excel、Pdf、Email邮件)

    这篇文章基于Python自动化办公,主要介绍了使用Python相关库,依次完成Word文档替换、Excel表格读取、Pdf文件生成和Email自动邮件发送任务。感兴趣的小伙伴可以跟随小编一起学习一下
    2021-12-12
  • Python while循环的基本用法与终止条件

    Python while循环的基本用法与终止条件

    本章详细介绍了Python中的while循环的基本用法与终止条件,包括其重要性应用场景技术原理实现方法关键技术点等进阶示例常见问题与解决方案最佳实践等内容最后总结了核心要点并提供思考题一步骤建议和延伸阅读建议,需要的朋友可以参考下
    2026-05-05
  • Python实现数据可视化图表生成(适合新手入门)

    Python实现数据可视化图表生成(适合新手入门)

    在数据科学和数据分析的新时代,高效、直观的数据可视化工具显得尤为重要,下面这篇文章主要介绍了Python实现数据可视化图表生成的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-08-08
  • python selenium登录豆瓣网过程解析

    python selenium登录豆瓣网过程解析

    这篇文章主要介绍了python selenium登录豆瓣网过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Python学习教程之常用的内置函数大全

    Python学习教程之常用的内置函数大全

    python给我们提供了很多已经定义好的函数,下面这篇文章主要给大家介绍了关于Python学习教程之一些常用的内置函数,文中分享了关于数学函数、功能函数、类型转换函数、字符串处理和序列处理函数的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • 基于Python实现浪漫的弹窗祝福满屏飘字效果(附完整代码)

    基于Python实现浪漫的弹窗祝福满屏飘字效果(附完整代码)

    这篇文章主要为大家详细介绍了如何基于Python实现浪漫的弹窗祝福满屏飘字效果,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解下
    2026-01-01
  • python脚本监听域名证书过期时间并通知消息到钉钉(最新推荐)

    python脚本监听域名证书过期时间并通知消息到钉钉(最新推荐)

    这篇文章主要介绍了python脚本监听域名证书过期时间并通知消息到钉钉(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-11-11
  • 对django 2.x版本中models.ForeignKey()外键说明介绍

    对django 2.x版本中models.ForeignKey()外键说明介绍

    这篇文章主要介绍了对django 2.x版本中models.ForeignKey()外键说明介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • 用TensorFlow实现戴明回归算法的示例

    用TensorFlow实现戴明回归算法的示例

    这篇文章主要介绍了用TensorFlow实现戴明回归算法的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • python 同时读取多个文件的例子

    python 同时读取多个文件的例子

    今天小编就为大家分享一篇python 同时读取多个文件的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07

最新评论