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实现的简单RPG游戏流程实例
Jun 28 Python
MySQL中表的复制以及大型数据表的备份教程
Nov 25 Python
Python的SQLalchemy模块连接与操作MySQL的基础示例
Jul 11 Python
Python模拟登陆实现代码
Jun 14 Python
简单实现python聊天程序
Apr 01 Python
python最小生成树kruskal与prim算法详解
Jan 17 Python
Python 中Django安装和使用教程详解
Jul 03 Python
在Python中获取操作系统的进程信息
Aug 27 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
Dec 19 Python
pycharm快捷键汇总
Feb 14 Python
简述 Python 的类和对象
Aug 21 Python
python Pexpect模块的使用
Dec 25 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实现分页的一个示例
2006/10/09 PHP
php多文件上传功能实现原理及代码
2013/04/18 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
JavaScript和CSS通过expression实现Table居中显示
2013/06/28 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
iframe调用父页面函数示例详解
2014/07/17 Javascript
JavaScript学习小结之使用canvas画“哆啦A梦”时钟
2016/07/24 Javascript
js实现四舍五入完全保留两位小数的方法
2016/08/02 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
angularjs中使用ng-bind-html和ng-include的实例
2017/04/28 Javascript
JS正则表达式完美实现身份证校验功能
2017/10/18 Javascript
Vue 过滤器filters及基本用法
2017/12/26 Javascript
vue.js 实现评价五角星组件的实例代码
2018/08/13 Javascript
express 项目分层实践详解
2018/12/10 Javascript
vue使用axios上传文件(FormData)的方法
2019/04/14 Javascript
Angular8基础应用之表单及其验证
2019/08/11 Javascript
vue请求服务器数据后绑定不上的解决方法
2019/10/30 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
vue中移动端调取本地的复制的文本方式
2020/07/18 Javascript
Vue 禁用浏览器的前进后退操作
2020/09/04 Javascript
python定时器使用示例分享
2014/02/16 Python
Python操作MongoDB详解及实例
2017/05/18 Python
实例讲解Python3中abs()函数
2019/02/19 Python
python3 实现的对象与json相互转换操作示例
2019/08/17 Python
Python pygame绘制文字制作滚动文字过程解析
2019/12/12 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
2020/03/08 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
2020/05/20 Python
韩都衣舍天猫官方旗舰店:天猫女装销售总冠军
2017/10/10 全球购物
渗透攻击的测试步骤
2014/06/07 面试题
幼儿教师个人求职信范文
2013/09/21 职场文书
《地震中的父与子》教学反思
2014/04/10 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
青涩记忆观后感
2015/06/18 职场文书