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使用mysqldb连接数据库操作方法示例详解
Dec 03 Python
python登录pop3邮件服务器接收邮件的方法
Apr 30 Python
Python编程实现双击更新所有已安装python模块的方法
Jun 05 Python
python3 pillow生成简单验证码图片的示例
Sep 19 Python
python矩阵的转置和逆转实例
Dec 12 Python
python打印直角三角形与等腰三角形实例代码
Oct 20 Python
Django 路由层URLconf的实现
Dec 30 Python
如何把外网python虚拟环境迁移到内网
May 18 Python
Python Scrapy多页数据爬取实现过程解析
Jun 12 Python
Python数据分析入门之教你怎么搭建环境
May 13 Python
python爬取网页版QQ空间,生成各类图表
Jun 02 Python
Django使用echarts进行可视化展示的实践
Jun 10 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生成及获取JSON文件的方法
2016/08/23 PHP
jQuery 连续列表实现代码
2009/12/21 Javascript
jQuery 学习第六课 实现一个Ajax的TreeView
2010/05/17 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
DWR中各种java方法的调用
2016/05/04 Javascript
jquery自定义插件——window的实现【示例代码】
2016/05/06 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
2017/05/02 Javascript
layui实现数据表格隐藏列的示例
2019/10/25 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
2020/05/09 Javascript
Vue清除定时器setInterval优化方案分享
2020/07/21 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
python通过pil将图片转换成黑白效果的方法
2015/03/16 Python
Python中的进程分支fork和exec详解
2015/04/11 Python
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
python实现K最近邻算法
2018/01/29 Python
Pandas读写CSV文件的方法示例
2019/03/27 Python
Python如何通过Flask-Mail发送电子邮件
2020/01/29 Python
pytorch实现seq2seq时对loss进行mask的方式
2020/02/18 Python
HTML5如何实现元素拖拽
2016/03/11 HTML / CSS
英国现代绅士品牌:Hackett
2017/12/17 全球购物
Pam & Gela官网:美国性感前卫女装品牌
2018/07/19 全球购物
全球精选男装和家居用品:Article
2020/04/13 全球购物
android面试问题与答案
2016/12/27 面试题
《少年王冕》教学反思
2014/04/11 职场文书
辅导员评语
2014/05/04 职场文书
优秀党支部书记事迹材料
2014/05/29 职场文书
博物馆观后感
2015/06/05 职场文书
暑期辅导班宣传单
2015/07/14 职场文书
采购部年度工作总结
2015/08/13 职场文书
2016小学优秀教师先进事迹材料
2016/02/26 职场文书
Oracle11g r2 卸载干净重装的详细教程(亲测有效已重装过)
2021/06/04 Oracle
小程序自定义轮播图圆点组件
2022/06/25 Javascript