python 超时重试方法
在应用中,有时候会 依赖第三方模块执行方法,比如调用某模块的上传下载,数据库查询等操作的时候,如果出现网络问题或其他问题,可能有超时重新请求的情况;
目前的解决方案有
1. 信号量,但不支持window;
2.多线程,但是 如果是大量的数据重复操作尝试,会出现线程管理混乱,开启上万个线程的问题;
3.结合采用 eventlet 和 retrying模块 (eventlet 原理尚需深入研究)
下面的方法实现:超过指定时间重新尝试某个方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
# -*- 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()
|
参考:
安装依赖模块:pip install retrying eventlet -i https://pypi.tuna.tsinghua.edu.cn/simple/
装饰器用法:https://blog.csdn.net/u013205877/article/details/78872278
retry: https://blog.csdn.net/lxy210781/article/details/95253026
超时:https://blog.csdn.net/yuanpython/article/details/90522567
其他方法:https://www.cnblogs.com/lyxdw/p/10033118.html