2012-02-27 24 views
15

tôi làm thử lại với cần tây như trong Documents-Ví dụ:Tăng thời gian cần tây retry mỗi retry chu kỳ

@task() 
def add(x, y): 
    try: 
     ... 
    except Exception, exc: 
     add.retry(exc=exc, countdown=60) # override the default and 
              # retry in 1 minute 

Làm thế nào tôi có thể làm tăng retry-đếm ngược mọi người thử lại xảy ra cho công việc này - ví dụ 60 giây, 2 phút, 4 phút, v.v. cho đến khi MaxRetriesExceeded được nâng lên?

+1

Tôi nghĩ bạn nên thay đổi câu trả lời được chọn. – guival

Trả lời

28

Đây là một cách đơn giản để tạo ra sự chậm trễ lớn hơn mỗi khi nhiệm vụ được đánh giá. Giá trị này được cập nhật bởi chính nó, vì vậy bạn không cần phải tự quản lý bất cứ thứ gì.

@task() 
def add(x, y): 
    try: 
     ... 
    except Exception as exc: 
     raise add.retry(exc=exc, countdown=60 * add.request.retries) 

Lưu ý: Nhiệm vụ đầu tiên được lặp lại với đếm ngược 0. Do số lần thử lại là 0 cho lần chạy đầu tiên.

+0

Cảm ơn bạn đã đề cập * thêm .request.retries * – Kaveh

7

Giữ một biến với thời gian retry cuối cùng của bạn trong nó, và nhân nó bằng 2 mỗi lần cho đến khi nó vượt quá mọi cấp độ bạn muốn (hoặc, giữ một số nếu bạn muốn có một số lần nhất định ...)

+0

Vì vậy, không có cách thanh lịch/kỳ diệu để làm điều này thay vì đi qua một thử lại truy cập vào phương pháp trên mỗi thử lại? – Gregor

+0

Tôi không quen thuộc với cần tây, nhưng nếu bạn đã đọc hướng dẫn và không tìm thấy nó, điều này có vẻ như một cách dễ dàng để thực hiện những gì bạn muốn chỉ với hai hoặc ba dòng mã, có vẻ dễ dàng. – Perry

+0

@Gregor, tôi nghĩ rằng điều này là thanh lịch, nhưng có lẽ chúng tôi có thể thêm một retry_step là tốt. Bạn có thể tạo một vấn đề tại http://github.com/ask/issue để yêu cầu một tính năng như vậy. – asksol

0

Kể từ version 4.2 bạn có thể sử dụng tùy chọn autoretry_forretry_backoff cho mục đích này, ví dụ:

@task(max_retries=10, autoretry_for=(Exception,), retry_backoff=60) 
def add(x, y): 
    pass 
Các vấn đề liên quan