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写一个简单的JSONParser

    教你使用Python写一个简单的JSONParser

    这篇文章主要介绍了教你使用Python写一个简单的JSONParser,它的整个效果,有点类似于 python 标准库 json 的 json.load() 方法,需要的朋友可以参考下
    2023-04-04
  • python中如何提高图像质量

    python中如何提高图像质量

    这篇文章主要介绍了python中如何提高图像质量问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 探索Python库coconut轻松地编写函数式代码实例

    探索Python库coconut轻松地编写函数式代码实例

    本文将介绍Python Coconut的基本概念、语法特性和实际应用,同时提供丰富的示例代码,以帮助大家更好地理解和应用这个强大的工具
    2024-01-01
  • pytorch模型保存与加载中的一些问题实战记录

    pytorch模型保存与加载中的一些问题实战记录

    一般来说,保存模型是把参数全部用model.cpu().state_dict(),然后加载模型时一般用model.load_state_dict(torch.load(model_path)),下面这篇文章主要给大家介绍了关于pytorch模型保存与加载中的一些问题实战记录,需要的朋友可以参考下
    2022-10-10
  • python实现矩阵乘法

    python实现矩阵乘法

    这篇文章主要介绍了python实现矩阵乘法,矩阵相乘需要前面矩阵的行数与后面矩阵的列数相同方可相乘,下面来看看python代码的具体实现吧
    2022-01-01
  • Python Pygame实战之实现经营类游戏梦想小镇代码版

    Python Pygame实战之实现经营类游戏梦想小镇代码版

    作为一名模拟经营类游戏的发烧友,各种农场类、医院类、铁路类的游戏玩儿了很多年。今天用代码给大家打造一款梦想小镇游戏,希望大家喜欢啦
    2022-12-12
  • 通过Python 接口使用OpenCV的方法

    通过Python 接口使用OpenCV的方法

    下面小编就为大家分享一篇通过Python 接口使用OpenCV的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Windows下Python使用Pandas模块操作Excel文件的教程

    Windows下Python使用Pandas模块操作Excel文件的教程

    Pandas是一个强大的Python数据分析模块,这里我们先使用ANACONDA来帮助获取Pandas所以来的一些环境,然后来初步学习Windows下Python使用Pandas模块操作Excel文件的教程
    2016-05-05
  • pandas中Timestamp类用法详解

    pandas中Timestamp类用法详解

    这篇文章主要为大家详细介绍了pandas中Timestamp类用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Python爬取腾讯视频评论的思路详解

    Python爬取腾讯视频评论的思路详解

    这篇文章主要介绍了Python爬取腾讯视频评论功能,本文图文详解给大家提供实现思路,需要的朋友可以参考下
    2019-12-12

最新评论