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之深入变量和引用对象
Sep 24 Python
浅谈python中的正则表达式(re模块)
Oct 17 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
May 25 Python
详解Python3 对象组合zip()和回退方式*zip
May 15 Python
Django 静态文件配置过程详解
Jul 23 Python
python 用 xlwings 库 生成图表的操作方法
Dec 22 Python
Python request操作步骤及代码实例
Apr 13 Python
Django在Model保存前记录日志实例
May 14 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
May 26 Python
浅谈keras中的目标函数和优化函数MSE用法
Jun 10 Python
UI自动化定位常用实现方法代码示例
Oct 27 Python
Python pyecharts案例超市4年数据可视化分析
Aug 14 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
十大催泪虐心动漫电影,有几部你还没看
2020/03/04 日漫
PHP常用的三种设计模式汇总
2016/08/28 PHP
jquery lazyload延迟加载技术的实现原理分析
2011/01/24 Javascript
在标题栏显示新消息提示,很多公司项目中用到这个方法
2011/11/04 Javascript
jquery插件制作 表单验证实现代码
2012/08/17 Javascript
关于JavaScript的面向对象和继承有利新手学习
2013/01/11 Javascript
JS生成随机字符串的多种方法
2014/06/10 Javascript
js中通过父级进行查找定位元素
2014/06/15 Javascript
JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式)
2015/08/04 Javascript
JavaScript学习小结(7)之JS RegExp
2015/11/29 Javascript
解析javascript图片懒加载与预加载的分析总结
2016/10/27 Javascript
基于BootstrapValidator的Form表单验证(24)
2016/12/12 Javascript
AngularJS指令中的绑定策略实例分析
2016/12/14 Javascript
js 实现获取name 相同的页面元素并循环遍历的方法
2017/02/14 Javascript
javascript中的面向对象
2017/03/30 Javascript
layui选项卡效果实现代码
2017/05/19 Javascript
Angular2 http jsonp的实例详解
2017/08/31 Javascript
JavaScript中字符串的常用操作方法及特殊字符
2018/03/18 Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
2020/04/29 Javascript
Python 返回汉字的汉语拼音
2009/02/27 Python
解决Python中list里的中文输出到html模板里的问题
2018/12/17 Python
Python PyInstaller安装和使用教程详解
2020/01/08 Python
python代码实现TSNE降维数据可视化教程
2020/02/28 Python
python实现人机五子棋
2020/03/25 Python
国际旅客访问北美最大的汽车租赁提供商:Alamo Rent A Car
2018/06/13 全球购物
澳大利亚二手奢侈品网站:Modsie
2019/09/23 全球购物
草莓网中国:StrawberryNet中国
2020/08/17 全球购物
白酒业务员岗位职责
2013/12/27 职场文书
农民工工资支付承诺函
2014/03/31 职场文书
南京南京观后感
2015/06/02 职场文书
2015年秋季学校开学标语
2015/07/16 职场文书
2019年工作总结范文
2019/05/21 职场文书
解析laravel使用workerman用户交互、服务器交互
2021/04/28 PHP
python关于集合的知识案例详解
2021/05/30 Python
利用Java设置Word文本框中的文字旋转方向的实现方法
2021/06/28 Java/Android
JavaScript设计模式之原型模式详情
2022/06/21 Javascript