利用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 importtime importlogging importsocket fromfunctoolsimportwraps logging.basicConfig(level=logging.DEBUG) defretry(MyException,tries=4,delay=3,backoff=2,logger=None): defdeco_retry(f): @wraps(f) deff_retry(*args,**kwargs): mtries,mdelay=tries,delay whilemtries>1: try: returnf(*args,**kwargs) exceptMyException asex: msg="%s, Retrying in %d seconds..."%(str(ex),mdelay) iflogger: logger.warning(msg) else: printmsg time.sleep(mdelay) mtries-=1 mdelay*=backoff returnstr(ex) returnf_retry returndeco_retry @retry(Exception,logger=logging) defcheck(): 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) |
本文出自 “wsky” 博客,谢绝转载!
原文:http://wsky09.blog.51cto.com/1613297/1355003