python 重试装饰器
利用python 写一些网络服务的时候,当网络状况不好,或者资源占用过多,任务拥塞的情况下,总会抛出一些异常,
当前任务就被终止了,可以很好的利用@装饰器,写一个重试的装饰器,这样比较python!
代码:
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
|
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# tanyewei@gmail.com
# 2014/01/27 10:36
import
time
import
logging
import
socket
from
functools
import
wraps
logging
.
basicConfig
(
level
=
logging
.
DEBUG
)
def
retry
(
MyException
,
tries
=
4
,
delay
=
3
,
backoff
=
2
,
logger
=
None
)
:
def
deco_retry
(
f
)
:
@
wraps
(
f
)
def
f_retry
(
*
args
,
*
*
kwargs
)
:
mtries
,
mdelay
=
tries
,
delay
while
mtries
>
1
:
try
:
return
f
(
*
args
,
*
*
kwargs
)
except
MyException
as
ex
:
msg
=
"%s, Retrying in %d seconds..."
%
(
str
(
ex
)
,
mdelay
)
if
logger
:
logger
.
warning
(
msg
)
else
:
print
msg
time
.
sleep
(
mdelay
)
mtries
-
=
1
mdelay
*=
backoff
return
str
(
ex
)
return
f_retry
return
deco_retry
@
retry
(
Exception
,
logger
=
logging
)
def
check
(
)
:
sk
=
socket
.
socket
(
)
sk
.
settimeout
(
5
)
sk
.
connect
(
(
'6.6.6.6'
,
80
)
)
if
__name__
==
"__main__"
:
check
(
)
|
只要在任何方法前面加上@retry(Exception, logger=logging)这样的装饰器,logger可有可无,Exception是所有异常的基类,这样就捕获了所有的异常。
这里演示的是连接ip为6.6.6.6,端口为80的主机。
1
|
tries
=
4(最大重试数)
,
delay
=
3(延迟)
,
backoff
=
2(延迟补偿,重试时间
=
delay*
2)
|
转载于:https://blog.51cto.com/wsky09/1355003