Python实现超时重试机制:基于eventlet与retrying的解决方案

小岛来信
小岛来信
发布时间:2026-10-13 | 6人浏览过
原创

本文介绍在Python应用中处理第三方模块调用超时时的重试策略。对比信号量、多线程及eventlet结合retrying模块的优缺点,重点展示如何利用eventlet的超时机制与retrying库实现指定次数和时间的自动重试,避免线程管理混乱,适用于大量数据重复操作的场景。

Python超时重试场景与方案对比

在实际开发中,应用常需依赖第三方模块执行特定方法,例如进行文件上传下载或数据库查询等操作。当遇到网络波动或其他异常导致请求超时时,系统往往需要执行重新请求的逻辑以保障任务完成。

针对此类场景,目前常见的解决思路包括以下几种:

第一种方案是利用信号量机制,但该方式在Windows操作系统下存在兼容性问题,无法直接使用。

第二种方案是采用多线程处理,然而若面对海量数据的重复操作尝试,多线程模式可能导致线程管理混乱,甚至出现开启上万个线程的资源耗尽问题。

第三种方案是结合使用eventlet库与retrying模块,尽管eventlet的具体底层原理仍需进一步深入研究,但该组合在实际应用中表现出较好的可行性。

下文将介绍一种具体实现方法,旨在当操作超过指定时间阈值时,自动重新尝试执行目标方法。

基于eventlet与retrying的实现代码


# -*- 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()

以上即为本文介绍的全部内容,希望上述方案能对读者的技术学习有所帮助,同时也欢迎大家继续支持本站,获取更多技术分享。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表