python超时重新请求解决方案

yipeiwu_com5年前Python基础

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

目前的解决方案有

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

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

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

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

# -*- 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设计】。

相关文章

可用于监控 mysql Master Slave 状态的python代码

复制代码 代码如下:import osimport sysimport MySQLdbdef getStatus(conn):    query = " S...

python opencv捕获摄像头并显示内容的实现

1、捕获摄像头和实时显示 import cv2 import numpy as np import pickle import matplotlib.pyplot as plt...

Python英文文本分词(无空格)模块wordninja的使用实例

在NLP中,数据清洗与分词往往是很多工作开始的第一步,大多数工作中只有中文语料数据需要进行分词,现有的分词工具也已经有了很多了,这里就不再多介绍了。英文语料由于其本身存在空格符所以无需跟...

python3.7环境下安装Anaconda的教程图解

python3.7环境下安装Anaconda的教程图解

下载Anaconda安装包 官网下载或是在清华大学镜像站下载,我安装的是下面这个版本:   安装过程 配置环境 将anaconda的scripts文件夹路径添...

python 2.7.13 安装配置方法图文教程

python 2.7.13 安装配置方法图文教程

本文记录了python安装及环境配置方法,具体内容如下 Python安装 Windowns操作系统中安装Python 步骤一 下载安装包 从Python网站下载Python的安装包 这...