• python 超时重试方法


    python 超时重试方法

     

    在应用中,有时候会 依赖第三方模块执行方法,比如调用某模块的上传下载,数据库查询等操作的时候,如果出现网络问题或其他问题,可能有超时重新请求的情况;

    目前的解决方案有

    1. 信号量,但不支持window;

    2.多线程,但是 如果是大量的数据重复操作尝试,会出现线程管理混乱,开启上万个线程的问题;

    3.结合采用 eventlet 和 retrying模块 (eventlet 原理尚需深入研究)

    下面的方法实现:超过指定时间重新尝试某个方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    # -*- coding: utf-8 -*-
    import random
    import time
     
    import eventlet
    from retrying import retry
     
    eventlet.monkey_patch()
     
     
    class RetryTimeOutException(Exception):
        def __init__(self, *args, **kwargs):
            pass
     
     
    def retry_if_timeout(exception):
        """Return True if we should retry (in this case when it's an IOError), False otherwise"""
        return isinstance(exception, RetryTimeOutException)
     
     
    def retry_fun(retries=3, timeout_second=2):
        """
        will retry ${retries} times when process time beyond ${timeout_second} ;
        :param retries: The retry times
        :param timeout_second: The max process time
        """
     
        def retry_decor(func):
            @retry(stop_max_attempt_number=retries, retry_on_exception=retry_if_timeout)
            def decor(*args, **kwargs):
                print("In retry method..")
                pass_flag = False
                with eventlet.Timeout(timeout_second, False):
                    r = func(*args, **kwargs)
                    pass_flag = True
                    print("Success after method.")
                if not pass_flag:
                    raise RetryTimeOutException("Time out..")
                print("Exit from retry.")
                return r
     
            return decor
     
        return retry_decor
     
     
    def do_request():
        print("begin request...")
        sleep_time = random.randint(1, 4)
        print("request sleep time: %s." % sleep_time)
        time.sleep(sleep_time)
        print("end request...")
        return True
     
     
    @retry_fun(retries=3)
    def retry_request():
        r = do_request()
        print(r)
     
     
    if __name__ == '__main__':
        retry_request()

      参考:

    安装依赖模块:pip install retrying eventlet -i https://pypi.tuna.tsinghua.edu.cn/simple/

    装饰器用法:https://blog.csdn.net/u013205877/article/details/78872278

    retry: https://blog.csdn.net/lxy210781/article/details/95253026

    超时:https://blog.csdn.net/yuanpython/article/details/90522567

    其他方法:https://www.cnblogs.com/lyxdw/p/10033118.html

     
     
    标签: python
    0
    0
     
     
     
    « 上一篇: c++动态编译 并调用
    » 下一篇: python 超时重试的方法 signal手段
    posted @ 2019-09-28 13:56  百变小超  阅读(158)  评论(1编辑  收藏
  • 相关阅读:
    【Android】 分享一个完整的项目,适合新手!
    Android笔记:Fragment与ViewPager组合时,如何在FragmentActicity获取Fragment对象
    android 获取日期
    Java: 分解List<HashMap<String, String>>
    android ExpandableListView实现不同的布局
    android: activity切换之效果
    android: activity之间切换的抽屉效果
    android 获取适配的bitmap等相关
    Eclipse改变外观,护眼模式
    安装 NoMachine(NX) client and server
  • 原文地址:https://www.cnblogs.com/du-jun/p/12375947.html
Copyright © 2020-2023  润新知