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调用cmd命令行制作刷博器
Jan 13 Python
在主机商的共享服务器上部署Django站点的方法
Jul 22 Python
Python 搭建Web站点之Web服务器与Web框架
Nov 06 Python
python下10个简单实例代码
Nov 15 Python
Python判断两个对象相等的原理
Dec 12 Python
python如何重载模块实例解析
Jan 25 Python
使用Python写一个小游戏
Apr 02 Python
django js实现部分页面刷新的示例代码
May 28 Python
从请求到响应过程中django都做了哪些处理
Aug 01 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
Oct 01 Python
PyInstaller的安装和使用的详细步骤
Jun 02 Python
python数字图像处理:图像简单滤波
Jun 28 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
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
php 更新数据库中断的解决方法
2009/06/05 PHP
php 在windows下配置虚拟目录的方法介绍
2013/06/26 PHP
PHP中判断文件存在使用is_file还是file_exists?
2015/04/03 PHP
作为程序员必知的16个最佳PHP库
2015/12/09 PHP
CI框架支持$_GET的两种实现方法
2016/05/18 PHP
thinkPHP5.0框架自动加载机制分析
2017/03/18 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
jquery post方式传递多个参数值后台以数组的方式进行接收
2013/01/11 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
2014/04/25 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
2014/05/04 Javascript
javascript根据时间生成m位随机数最大13位
2014/10/30 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
2015/01/13 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享
2015/09/21 Javascript
Node.js的基本知识简单汇总
2016/09/19 Javascript
js纯前端实现腾讯cos文件上传功能的示例代码
2019/05/14 Javascript
[03:09]显微镜下的DOTA2第一期——带你走进华丽的DOTA2世界
2014/06/20 DOTA
Python实现程序的单一实例用法分析
2015/06/03 Python
django中的HTML控件及参数传递方法
2018/03/20 Python
Django框架自定义session处理操作示例
2019/05/27 Python
python自带tkinter库实现棋盘覆盖图形界面
2019/07/17 Python
html5的自定义data-*属性与jquery的data()方法的使用
2014/07/02 HTML / CSS
大学生毕业求职的自我评价
2013/09/29 职场文书
总经理职责
2013/12/22 职场文书
高中化学教学反思
2014/01/13 职场文书
应届生求职自荐信范文
2014/04/07 职场文书
学前班评语大全
2014/05/04 职场文书
学习习近平主席讲话心得体会
2016/01/20 职场文书
导游词之河姆渡遗址博物馆
2019/10/10 职场文书
python实战之90行代码写个猜数字游戏
2021/04/22 Python
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server
Spring Boot 实现 WebSocket
2022/04/30 Java/Android