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中asyncore异步模块的用法及实现httpclient的实例
Jun 28 Python
利用Python脚本实现ping百度和google的方法
Jan 24 Python
python实现手机通讯录搜索功能
Feb 22 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
Aug 12 Python
python 实现单通道转3通道
Dec 03 Python
Django后端发送小程序微信模板消息示例(服务通知)
Dec 17 Python
python 用opencv实现图像修复和图像金字塔
Nov 27 Python
用Python远程登陆服务器的步骤
Apr 16 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 Python
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
Nov 11 Python
Python Pandas解析读写 CSV 文件
Apr 11 Python
python如何为list实现find方法
May 30 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
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
详细解读PHP的Yii框架中登陆功能的实现
2015/08/21 PHP
PHP的Yii框架入门使用教程
2016/02/15 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
2016/09/22 PHP
PHP 常用时间函数资料整理
2016/10/22 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
js 固定悬浮效果实现思路代码
2013/08/02 Javascript
jQuery实现级联菜单效果(仿淘宝首页菜单动画)
2014/04/10 Javascript
jQuery中outerHeight()方法用法实例
2015/01/19 Javascript
AngularJs Scope详解及示例代码
2016/09/01 Javascript
nodejs multer实现文件上传与下载
2017/05/10 NodeJs
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
Angular 4.0学习教程之架构详解
2017/09/12 Javascript
在 Node.js 中使用 async 函数的方法
2017/11/17 Javascript
一文了解Vue中的nextTick
2019/05/06 Javascript
了解javascript中变量及函数的提升
2019/05/27 Javascript
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
原生JavaScript实现五子棋游戏
2020/11/09 Javascript
对pandas读取中文unicode的csv和添加行标题的方法详解
2018/12/12 Python
对Python 除法负数取商的取整方式详解
2018/12/12 Python
python web框架 django wsgi原理解析
2019/08/20 Python
详解Python 中sys.stdin.readline()的用法
2019/09/12 Python
Django实现简单网页弹出警告代码
2019/11/15 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
Python 绘制可视化折线图
2020/07/22 Python
使用HTML5和CSS3表单验证功能
2017/05/05 HTML / CSS
使用css3制作登录表单的步骤
2014/04/07 HTML / CSS
trivago美国:全球最大的酒店价格比较网站
2018/01/18 全球购物
Expedia印度尼西亚站:预订酒店、廉价航班和度假套餐
2018/01/31 全球购物
香港最大的洋酒零售连锁店:屈臣氏酒窖(Watson’s Wine)
2018/12/10 全球购物
金融专业应届生求职信
2013/11/02 职场文书
开办化妆品公司创业计划书
2013/12/26 职场文书
人事任命书范文
2014/06/04 职场文书
Python实现天气查询软件
2021/06/07 Python
解决Mysql报错 Table 'mysql.user' doesn't exist
2022/05/06 MySQL