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的Django框架编写从Google Adsense中获得报表的应用
Apr 17 Python
python使用PIL模块实现给图片打水印的方法
May 22 Python
详解Python编程中基本的数学计算使用
Feb 04 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
Jun 15 Python
python实现画圆功能
Jan 25 Python
python函数式编程学习之yield表达式形式详解
Mar 25 Python
Python编程图形库之Pillow使用方法讲解
Dec 28 Python
Pandas时间序列:重采样及频率转换方式
Dec 26 Python
Python如何在windows环境安装pip及rarfile
Jun 15 Python
Python Selenium实现无可视化界面过程解析
Aug 25 Python
你喜欢篮球吗?Python实现篮球游戏
Jun 11 Python
Python四款GUI图形界面库介绍
Jun 05 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
Zerg兵种介绍
2020/03/14 星际争霸
PHP资源管理框架Assetic简介
2014/06/12 PHP
yii操作session实例简介
2014/07/31 PHP
php实现给图片加灰色半透明效果的方法
2014/10/20 PHP
PHP获取当前文件的父目录方法汇总
2016/07/21 PHP
PHP使用DOM对XML解析处理操作示例
2019/07/04 PHP
PHP 8新特性简介
2020/08/18 PHP
Javascript与flash交互通信基础教程
2008/08/07 Javascript
JS实现self的resend
2010/07/22 Javascript
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
2011/07/10 Javascript
js实现简单登录功能的实例代码
2013/11/09 Javascript
基于jQuery实现文本框缩放以及上下移动功能
2014/11/24 Javascript
javascript解三阶幻方(九宫格)
2015/04/22 Javascript
javaScript实现滚动新闻的方法
2015/07/30 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
2016/06/22 Javascript
jquery ui sortable拖拽后保存位置
2017/04/27 jQuery
Vue路由跳转问题记录详解
2017/06/15 Javascript
基于vue2.0实现简单轮播图
2017/11/27 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
vue插件mescroll.js实现移动端上拉加载和下拉刷新
2019/03/07 Javascript
基于Layui自定义模块的使用方法详解
2019/09/14 Javascript
node 文件上传接口的转发的实现
2019/09/23 Javascript
手机浏览器唤起微信分享(JS)
2020/10/11 Javascript
python实现指定字符串补全空格、前面填充0的方法
2018/11/16 Python
Python 实现遥感影像波段组合的示例代码
2019/08/04 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
使用python批量转换文件编码为UTF-8的实现
2020/04/03 Python
python wsgiref源码解析
2021/02/06 Python
Currentbody美国/加拿大:美容仪专家
2020/03/09 全球购物
机电一体化专业应届本科生求职信
2013/09/27 职场文书
房屋出售协议书
2014/04/10 职场文书
心理咨询专业自荐信
2014/07/07 职场文书
2015中秋祝酒词
2015/08/12 职场文书
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang
MySQL实现用逗号进行拼接、以逗号进行分割
2022/12/24 MySQL