python防止程序超时的实现示例

 更新时间:2023年08月24日 15:21:28   作者:梦想闹钟  
因为某个需求,需要在程序运行的时候防止超时,本文主要介绍了python防止程序超时的实现示例,具有一定的参考价值,感兴趣的可以了解一下

因为某个需求,需要在程序运行的时候防止超时。在网上搜了以下发现有3种方法

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('子程序超时')

2.多进程/多限制的.join

比如下面的代码

import time
import threading
def worker():
    print('worker start')
    time.sleep(10)
    print('worker end')
t = threading.Thread(target=worker)
t.start()
# 等待线程结束,不能超过5秒
t.join(5)
if t.is_alive():
    print('worker overtime')
else:
    print('worker finished')

实测发现运行结果是这样,到了5秒提示overtime但是程序继续运行,然后到了10秒程序运行结束,虽然有超时的效果但是和我设想的还是有区别,我想的是时间到了你就别继续运行了

3.使用eventlet.Timeout来实现

实测下来这个是最符合我需求的,时间到了直接跳出,加一个timeout的变量就能知道是否超时了。美中不足就是必须加一条语句,eventlet.monkey_patch(),简单搜索了下发现这个属于程序在运行时动态对已有代码进行修改,而不需要修改原始代码的一个热补丁。

使用了eventlet后,同时处理超时和异常的代码如下

"""
用于处理函数超时的情况,同时记录程序异常
"""
import eventlet
class PyTimer:
    """
    用于在处理异常的同时防止程序超时
    """
    def __init__(self, max_time=5):
        """
        初始化
        """
        # 必须有这条代码
        eventlet.monkey_patch()
        self.errors = ""
        # 最大超时的秒数
        self.max_time = max_time
    def set_max_time(self,new_time):
        """
        设置新的超时秒数
        """
        self.max_time=new_time
    def count_time(self, function, *args):
        """
        运行函数,记录异常,同时超时跳出
        """
        return_result = None
        timeout = True
        current_error = ""
        try:
            with eventlet.Timeout(self.max_time, False):  # 设置超时时间为5秒
                return_result = function(*args)
                timeout = False
        except Exception as e:
            current_error = str(e) + "\n"
        finally:
            if timeout:
                current_error += function.__name__ + "超时\n"
                print(current_error)
                self.errors += current_error
            return return_result
    def get_errors(self):
        """
        获取报错信息
        """
        return self.errors
if __name__ == '__main__':
    def long_fun(a, b):
        import time
        print(a, b)
        time.sleep(20)
    my_timer = PyTimer()
    my_timer.count_time(long_fun, 1, 2)

到此这篇关于python防止程序超时的实现示例的文章就介绍到这了,更多相关python防止程序超时内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Python  __getattr__与__setattr__使用方法

    Python __getattr__与__setattr__使用方法

    __getattr__和__setattr__可以用来对属性的设置和取值进行处理
    2008-09-09
  • pytorch 模拟关系拟合——回归实例

    pytorch 模拟关系拟合——回归实例

    今天小编就为大家分享一篇pytorch 模拟关系拟合——回归实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python语法学习之进程池与进程锁详解

    Python语法学习之进程池与进程锁详解

    这篇文章主要为大家介绍了Python进程中两个重要的知识点:进程池与进程锁,文中通过示例详细为大家讲解了二者的使用,感兴趣的可以了解下
    2022-04-04
  • 浅谈tensorflow语义分割api的使用(deeplab训练cityscapes)

    浅谈tensorflow语义分割api的使用(deeplab训练cityscapes)

    这篇文章主要介绍了浅谈tensorflow语义分割api的使用(deeplab训练cityscapes),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • Python光学仿真之对光的干涉理解学习

    Python光学仿真之对光的干涉理解学习

    这篇文章主要为大家介绍了Python光学仿真之对光的干涉理解学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-10-10
  • Python异常学习笔记

    Python异常学习笔记

    这篇文章主要介绍了Python异常学习笔记,本文着重讲解了如何自定义一个异常,需要的朋友可以参考下
    2015-02-02
  • python爬虫http代理使用方法

    python爬虫http代理使用方法

    在本篇文章里小编给大家整理的是一篇关于python爬虫http代理使用方法相关内容,有需要的朋友们可以跟着学习参考下。
    2021-09-09
  • python 2.7.14安装图文教程

    python 2.7.14安装图文教程

    这篇文章主要为大家详细介绍了python 2.7.14安装图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • python3 使用traceback定位异常实例

    python3 使用traceback定位异常实例

    这篇文章主要介绍了python3 使用traceback定位异常实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • python实现的自动发送消息功能详解

    python实现的自动发送消息功能详解

    这篇文章主要介绍了python实现的自动发送消息功能,涉及Python基于requests、itchat库的数据请求与信息处理相关操作技巧,需要的朋友可以参考下
    2019-08-08

最新评论