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 相关文章推荐
使用PDB模式调试Python程序介绍
Apr 05 Python
Python与Redis的连接教程
Apr 22 Python
Python中文件I/O高效操作处理的技巧分享
Feb 04 Python
对numpy的array和python中自带的list之间相互转化详解
Apr 13 Python
Selenium鼠标与键盘事件常用操作方法示例
Aug 13 Python
详解python配置虚拟环境
Apr 08 Python
OpenCV 边缘检测
Jul 10 Python
django做form表单的数据验证过程详解
Jul 26 Python
Python定时器线程池原理详解
Feb 26 Python
python求解汉诺塔游戏
Jul 09 Python
Python接口自动化测试框架运行原理及流程
Nov 30 Python
Python标准库之typing的用法(类型标注)
Jun 02 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
php处理json时中文问题的解决方法
2011/04/12 PHP
PHP查询附近的人及其距离的实现方法
2016/05/11 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
2016/07/18 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
php json转换相关知识(小结)
2018/12/21 PHP
jquery lazyload延迟加载技术的实现原理分析
2011/01/24 Javascript
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
script标签属性用type还是language
2015/01/21 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
vue组件间通信解析
2017/03/01 Javascript
jQuery实现简单的计时器功能实例分析
2017/08/29 jQuery
Nodejs连接mysql并实现增、删、改、查操作的方法详解
2018/01/04 NodeJs
vue 插值 v-once,v-text, v-html详解
2018/01/19 Javascript
AngularJS ui-router刷新子页面路由的方法
2018/07/23 Javascript
详解vuejs中执行npm run dev出现页面cannot GET/问题
2020/04/26 Javascript
[48:31]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第一场 2月2日
2021/03/11 DOTA
Python 字典(Dictionary)操作详解
2014/03/11 Python
python基础while循环及if判断的实例讲解
2017/08/25 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
2018/03/04 Python
python 文件转成16进制数组的实例
2018/07/09 Python
基于python中theano库的线性回归
2018/08/31 Python
Python装饰器简单用法实例小结
2018/12/03 Python
学python需要去培训机构吗
2020/07/01 Python
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
园林设计师自荐信
2013/11/18 职场文书
校园餐饮创业计划书
2014/01/10 职场文书
小学生环保演讲稿
2014/04/25 职场文书
学雷锋标语
2014/06/25 职场文书
上课玩手机的检讨书
2014/10/01 职场文书
防火标语大全
2014/10/06 职场文书
群众路线自我剖析及整改措施
2014/11/04 职场文书
Python列表删除重复元素与图像相似度判断及删除实例代码
2021/05/07 Python
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB
JavaScript中的宏任务和微任务详情
2021/11/27 Javascript
python分分钟绘制精美地图海报
2022/02/15 Python
利用Apache Common将java对象池化的问题
2022/06/16 Servers