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中的赋值运算符
May 13 Python
python计算文本文件行数的方法
Jul 06 Python
python 信息同时输出到控制台与文件的实例讲解
May 11 Python
基于Django与ajax之间的json传输方法
May 29 Python
python+splinter实现12306网站刷票并自动购票流程
Sep 25 Python
详解Python3中的迭代器和生成器及其区别
Oct 09 Python
六行python代码的爱心曲线详解
May 17 Python
Python企业编码生成系统之主程序模块设计详解
Jul 26 Python
Python倒排索引之查找包含某主题或单词的文件
Nov 13 Python
pytorch 实现打印模型的参数值
Dec 30 Python
python实现excel公式格式化的示例代码
Dec 23 Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
Apr 07 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
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
2013/06/24 PHP
PHP中的Memcache详解
2014/04/05 PHP
Zend Framework教程之资源(Resources)用法实例详解
2016/03/14 PHP
php微信开发自定义菜单
2016/08/27 PHP
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
jQuery中的AjaxSubmit使用讲解
2016/09/25 Javascript
jQuery实现表格与ckeckbox的全选与单选功能
2016/11/24 Javascript
详谈jQuery中的一些正则匹配表达式
2017/03/08 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
JavaScript原型对象原理与应用分析
2018/12/27 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
jQuery实现鼠标移入显示蒙版效果
2020/01/11 jQuery
JavaScript单线程和任务队列原理解析
2020/02/04 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
2020/07/26 Javascript
H5+css3+js搭建带验证码的登录页面
2020/10/11 Javascript
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
python文件操作相关知识点总结整理
2016/02/22 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
Django之无名分组和有名分组的实现
2019/04/16 Python
Python制作词云图代码实例
2019/09/09 Python
Python zip函数打包元素实例解析
2019/12/11 Python
浅析python标准库中的glob
2020/03/13 Python
纯HTML5+CSS3制作生日蛋糕(代码易懂)
2016/11/16 HTML / CSS
Kipling凯浦林美国官网:世界著名时尚休闲包袋品牌
2016/08/24 全球购物
SQL中where和having的区别
2012/06/17 面试题
如何高效率的查找一个月以内的数据
2012/04/15 面试题
教师简历自我评价
2014/02/03 职场文书
测量工程专业求职信
2014/02/24 职场文书
大学应届生的自我评价
2014/03/06 职场文书
大学生实习证明范本
2014/09/19 职场文书
学校党委干部个人对照检查材料思想汇报
2014/10/09 职场文书
优秀党员个人总结
2015/02/14 职场文书
电影地道战观后感
2015/06/04 职场文书
2016年先进班集体事迹材料
2016/02/26 职场文书
竞选稿之小学班干部
2019/10/31 职场文书