python超时重新请求解决方案


Posted in Python onOctober 21, 2019

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

目前的解决方案有

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 相关文章推荐
浅析Python中的for 循环
Jun 09 Python
python类:class创建、数据方法属性及访问控制详解
Jul 25 Python
Python编程之event对象的用法实例分析
Mar 23 Python
python 基本数据类型占用内存空间大小的实例
Jun 12 Python
Python简单获取二维数组行列数的方法示例
Dec 21 Python
python下PyGame的下载与安装过程及遇到问题
Aug 04 Python
Python 中的 global 标识对变量作用域的影响
Aug 12 Python
python-Web-flask-视图内容和模板知识点西宁街
Aug 23 Python
PyCharm2019安装教程及其使用(图文教程)
Sep 29 Python
Python如何把十进制数转换成ip地址
May 25 Python
Python request post上传文件常见要点
Nov 20 Python
Python的三个重要函数详解
Jan 18 Python
详解python中*号的用法
Oct 21 #Python
python中bytes和str类型的区别
Oct 21 #Python
python中@property和property函数常见使用方法示例
Oct 21 #Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
Oct 21 #Python
基于python解线性矩阵方程(numpy中的matrix类)
Oct 21 #Python
python打印直角三角形与等腰三角形实例代码
Oct 20 #Python
python配置文件写入过程详解
Oct 19 #Python
You might like
咖啡常见的种类
2021/03/03 新手入门
一个简单的php实现的MySQL数据浏览器
2007/03/11 PHP
php获得url参数中具有&的值的方法
2014/03/05 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
php实现自定义中奖项数和概率的抽奖函数示例
2017/05/26 PHP
PHP调用其他文件中的类
2018/04/02 PHP
js变量作用域及可访问性的探讨
2006/11/23 Javascript
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
jquery获取iframe中的dom对象(两种方法)
2013/07/02 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
2014/11/26 Javascript
JS+CSS实现六级网站导航主菜单效果
2015/09/28 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
javascript中JSON.parse()与eval()解析json的区别
2016/05/19 Javascript
详解jQuery停止动画——stop()方法的使用
2016/12/14 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
vue快捷键与基础指令详解
2017/06/01 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
微信小程序模板(template)使用详解
2018/01/31 Javascript
微信小程序数据统计和错误统计的实现方法
2019/06/26 Javascript
layui radio点击事件实现input显示和隐藏的例子
2019/09/02 Javascript
vue实现放大镜效果
2020/09/17 Javascript
Python判断文件和文件夹是否存在的方法
2015/05/21 Python
以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
2016/01/20 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
2016/05/25 Python
如何解决tensorflow恢复模型的特定值时出错
2020/02/06 Python
英国文具、办公用品和科技商店:Ryman
2018/09/27 全球购物
美国Jeep配件购物网站:Morris 4×4 Center
2019/05/01 全球购物
建议书标准格式
2014/03/12 职场文书
文明工地标语
2014/06/16 职场文书
2014领导班子“四风问题”对照检查材料思想汇报(执法局)
2014/09/21 职场文书
2014国庆节国旗下演讲稿(精选版)
2014/09/26 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
电气工程师岗位职责
2015/02/12 职场文书
西安事变观后感
2015/06/12 职场文书
【海涛教你打DOTA】虚空假面第一视角骨弓3房29杀
2022/04/01 DOTA