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实现代理服务功能实例
Nov 15 Python
好用的Python编辑器WingIDE的使用经验总结
Aug 31 Python
解决uWSGI的编码问题详解
Mar 24 Python
CentOS中升级Python版本的方法详解
Jul 10 Python
Python3操作SQL Server数据库(实例讲解)
Oct 21 Python
Python实现对百度云的文件上传(实例讲解)
Oct 21 Python
用matplotlib画等高线图详解
Dec 14 Python
pandas删除行删除列增加行增加列的实现
Jul 06 Python
Python中Unittest框架的具体使用
Aug 27 Python
python tkinter实现连连看游戏
Nov 16 Python
pandas将list数据拆分成行或列的实现
Dec 13 Python
pytorch 运行一段时间后出现GPU OOM的问题
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 多进程 解决难题
2009/06/22 PHP
PHP 简单数组排序实现代码
2009/08/05 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
PHP实现视频文件上传完整实例
2014/08/28 PHP
Mootools 1.2教程 滑动效果(Slide)
2009/09/15 Javascript
extJs 下拉框联动实现代码
2010/04/09 Javascript
innerHTML动态添加html代码和脚本兼容多个浏览器
2014/10/11 Javascript
深入浅析react native es6语法
2015/12/09 Javascript
一道关于JavaScript变量作用域的面试题
2016/03/08 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
2016/09/30 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
实现jquery放大镜的两种方法
2018/02/22 jQuery
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
详解element-ui日期时间选择器的日期格式化问题
2019/04/08 Javascript
vue项目中使用scss的方法步骤
2019/05/16 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
[05:36]DOTA2 2015国际邀请赛中国区预选赛第四日TOP10
2015/05/29 DOTA
Python 的 with 语句详解
2014/06/13 Python
详解Python3中的Sequence type的使用
2015/08/01 Python
Python和Perl绘制中国北京跑步地图的方法
2016/03/03 Python
Python编程中装饰器的使用示例解析
2016/06/20 Python
python pandas 组内排序、单组排序、标号的实例
2018/04/12 Python
使用python进行波形及频谱绘制的方法
2019/06/17 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
基于python爬取链家二手房信息代码示例
2020/10/21 Python
Microsoft新加坡官方网站:购买微软最新软件和技术产品
2016/10/28 全球购物
动态密码技术
2012/10/18 面试题
表彰先进的通报
2014/01/31 职场文书
毕业生工作求职信
2014/06/30 职场文书
应届毕业生求职信范文
2014/07/07 职场文书
忠诚教育心得体会
2014/09/03 职场文书
自愿解除劳动合同协议书
2014/09/11 职场文书
学校师德师风整改措施
2014/10/27 职场文书
对外汉语教师推荐信
2015/03/27 职场文书
公司行政主管岗位职责
2015/04/09 职场文书
python基础之文件处理知识总结
2021/05/23 Python