重试运行函数的Pythonic方式 [英] Pythonic way of retry running a function
本文介绍了重试运行函数的Pythonic方式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
Python专业人员如何重试运行将请求Web服务的功能(Web服务有时会失败)
How a Python Professinal would retry running a function that will request a web service(the webservice sometimes fails)
该功能:
def some_request(uri):
try:
req = requests.post('http://someuri.com', {'test': 'yes'})
except Exception as e:
return False
return {'id': req.json()['value'], 'other': req.json()['other']}
您使用一会儿还是其他python惯用语来处理重试?
You handle the retry with a while or other python idiom?
为我提供了正确方法的线索。
Give me a clue on how to do it the right way.
推荐答案
定义重试实用程序:
# Retry utility
# set logging for `retry` channel
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger('retry')
# Define Exception class for retry
class RetryException(Exception):
u_str = "Exception ({}) raised after {} tries."
def __init__(self, exp, max_retry):
self.exp = exp
self.max_retry = max_retry
def __unicode__(self):
return self.u_str.format(self.exp, self.max_retry)
def __str__(self):
return self.__unicode__()
# Define retry util function
def retry_func(func, max_retry=10):
"""
@param func: The function that needs to be retry
@param max_retry: Maximum retry of `func` function, default is `10`
@return: func
@raise: RetryException if retries exceeded than max_retry
"""
for retry in range(1, max_retry + 1):
try:
return func()
except Exception, e:
logger.info('Failed to call {}, in retry({}/{})'.format(func.func,
retry, max_retry))
else:
raise RetryException(e, max_retry)
使用它:
from functools import partial
import requests
def some_request(uri, post):
req = requests.post(uri, post)
return req
uri = 'http://someuri.com'
post = {'test': 'yes'}
try:
retry_func(partial(some_request, uri, post), max_retry=3)
except RetryException, e:
print(e)
输出:
INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): someuri.com
INFO:retry:Failed to call <function some_request at 0x7faaba2318c0>, in retry(1/3)
INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): someuri.com
INFO:retry:Failed to call <function some_request at 0x7faaba2318c0>, in retry(2/3)
INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): someuri.com
INFO:retry:Failed to call <function some_request at 0x7faaba2318c0>, in retry(3/3)
Exception (HTTPConnectionPool(host='someuri.com', port=80): Max retries exceeded with url: / (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)) raised after 3 tries.
这篇关于重试运行函数的Pythonic方式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文