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 相关文章推荐
Linux下使用python自动修改本机网关代码分享
May 21 Python
python中星号变量的几种特殊用法
Sep 07 Python
Python Sqlite3以字典形式返回查询结果的实现方法
Oct 03 Python
python 计算文件的md5值实例
Jan 13 Python
基于Python代码编辑器的选用(详解)
Sep 13 Python
Python探索之修改Python搜索路径
Oct 25 Python
python实现淘宝购物系统
Oct 25 Python
利用Python自动化操作AutoCAD的实现
Apr 01 Python
使用keras和tensorflow保存为可部署的pb格式
May 25 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
May 25 Python
Python Merge函数原理及用法解析
Sep 16 Python
基于python模拟bfs和dfs代码实例
Nov 19 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 Token(令牌)设计
2008/03/15 PHP
MAC下通过改apache配置文件切换php多版本的方法
2017/04/26 PHP
在Laravel5中正确设置文件权限的方法
2019/05/22 PHP
Apply an AutoFormat to an Excel Spreadsheet
2007/06/12 Javascript
jQuery前台数据获取实现代码
2011/03/16 Javascript
判断客户浏览器是否支持cookie的示例代码
2013/12/23 Javascript
javascript操纵OGNL标签示例代码
2014/06/16 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
超级简单的jquery操作表格方法
2014/12/15 Javascript
深入探讨前端框架react
2015/12/09 Javascript
javascript返回顶部的按钮实现方法
2016/01/09 Javascript
bootstrap下拉菜单使用方法解析
2017/01/13 Javascript
微信小程序 template模板详解及实例
2017/02/21 Javascript
JS奇技之利用scroll来监听resize详解
2017/06/15 Javascript
vue和webpack项目构建过程常用的npm命令详解
2018/06/15 Javascript
微信小程序实现倒计时补零功能
2018/07/09 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
详解Vue中watch的详细用法
2018/11/28 Javascript
vue 验证两次输入的密码是否一致的方法示例
2020/09/29 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
Python实现对字符串的加密解密方法示例
2017/04/29 Python
Python实现登录接口的示例代码
2017/07/21 Python
python 中的int()函数怎么用
2017/10/17 Python
Django实现从数据库中获取到的数据转换为dict
2020/03/27 Python
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
2014/07/21 HTML / CSS
html5 视频播放解决方案
2016/11/06 HTML / CSS
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
单位刻章介绍信范文
2014/01/11 职场文书
业务部门经理岗位职责
2014/02/23 职场文书
买卖协议书范本
2014/04/21 职场文书
汽车车尾标语大全
2015/08/11 职场文书
MySQL 字符集 character
2022/05/04 MySQL
mysql性能优化以及配置连接参数设置
2022/05/06 MySQL