# retry

## 1 功能

* 函数可以根据以下条件重试:
  * 执行结果是否成功 (like a status code not equaling 200)
  * Exceptions (like a function raising a requests.RequestException)
    * 所有接受的异常也会在失败时引发原始异常！
* 函数执行失败可能是:
  * 超过最大重试次数
  * 达到最大超时时间
* 函数重试可以按特定的间隔间隔进行

## 2 例子

### 2.1 简单例子

```
from xlib.util import retry

print "------------------------------------------func"
@retry.retry(max_retries=3, interval=5)
def add(a, b):
    return a + b


print add(3, 5)

print "------------------------------------------class"
class Demo():
    @retry.retry(max_retries=3, interval=5)
    def add(self, a, b):
        assert a == 4
        return a + b

demo = Demo()
print demo.add(3, 5)
```

### 2.2 装饰器

Send a `GET` request to a URL until it returns a status code of 200!

> 每秒重试一次

```python
import requests

from xlib.util import retry

@retry.retry(max_retries=-1, interval=1, success=lambda x: x.status_code == 200)
def poll_url(url, method='GET'):
    return requests.request(method, url)
```

### 2.3 添加超时时间

Same function as above, timeout after 10 seconds!

```python
import requests

from xlib.util import retry

@retry.retry(max_retries=-1, interval=1, success=lambda x: x.status_code == 200, timeout=10)
def poll_url(url, method='GET'):
    return requests.request(method, url)
```

### 2.4 添加 exceptions 参数

Same function as above, timeout after 10 seconds!

```python
import requests

from xlib.util import retry

@retry.retry(
    exceptions=(requests.RequestException,), max_retries=-1, interval=1,
    success=lambda x: x.status_code == 200, timeout=10)
def poll_url(url, method='GET'):
    return requests.request(method, url)
```
