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

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

本文介绍在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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。