2015-03-30 19 views
6

Có thể chạy lại cuộc gọi chord ngay cả khi các tác vụ chính không thành công?Chạy cuộc gọi lại hợp âm ngay cả khi các tác vụ chính không thành công

Tôi đã tạo một hợp âm mà tôi đã thêm một loạt các tác vụ và đăng ký gọi lại cho nó. Vấn đề của tôi, là nếu một trong các nhiệm vụ thất bại gọi lại không được kích hoạt, nhưng tôi muốn gọi lại được kích hoạt một trong hai cách.

Tôi đã cố gắng để đăng ký callback với si() (immutability)

callback = tasks.run_delete_rule.si([timestamp]) 
header = [tasks.run_update_rule.s(i, timestamp) for i in item_ids] 
result = chord(header)(callback) 

Tôi cũng đã cố gắng để thêm param ignore_result=True cho cả hai nhiệm vụ trang trí, nhưng không thành công.

+1

Tôi đang tìm giải pháp này. –

Trả lời

5

Từ vấn đề github #1881 nếu gọi lại có bộ tùy chọn link_error, có danh sách tên tác vụ, khi nhiệm vụ của cuộc trò chuyện không thực hiện được nhiệm vụ của liên kết.

@task(name='super_task.good') 
def good(): 
    return True 

@task(name='super_task.raise_exception') 
def raise_exception(): 
    raise ValueError('error') 

@task(name='super_task.callback') 
def callback(*args, **kwargs): 
    logger.info('callback') 
    logger.info(args) 
    logger.info(kwargs) 
    return 'finished' 

@task(name='super_task.error_callback') 
def error_callback(*args, **kwargs): 
    logger.info('error_callback') 
    logger.info(args) 
    logger.info(kwargs) 
    return 'error' 

>>> c = chord(
     [raise_exception.s(), good.s(), raise_exception.s()], 
     callback.s().set(link_error=['super_task.error_callback']) 
    ) 
>>> result = c() 

này sẽ thực hiện hợp âm và trong nhật ký cần tây, bạn sẽ thấy nhiệm vụ raise_exception thất bại, và việc thực hiện các error_callback mà sẽ nhận được trong đó là ARGS các task_id của callback.

Tại thời điểm này giá trị của result sẽ chứa AsyncResult thể hiện của callback, và bởi vì trong một hợp âm các lỗi tuyên truyền để gọi lại làm result.get() sẽ nâng cao ngoại lệ trong những nhiệm vụ và mang đến cho bạn result.traceback traceback.

Nếu bạn muốn có một cuộc gọi lại duy nhất, chỉ cần vượt qua tên của callback hợp âm để link_error

callback.s().set(link_error='super_task.callback') 

LƯU Ý

Một lựa chọn nó để thiết lập CELERY_CHORD_PROPAGATES = False đó sẽ trở lại cần tây trước 3.1 hành vi và luôn thực hiện gọi lại.

Nhưng đây không phải là một phương pháp khuyến khích bởi vì như bạn có thể tìm thấy trong vấn đề github #1349

Cần tây 3.1 định nghĩa cách lỗi âm được xử lý, hành vi trước đây không bao giờ được ghi nhận và nhiều hơn nữa xảy ra tai nạn vì nó không bao giờ có ý định làm việc theo cách đó.

Chúng tôi không thể thay đổi hành vi trong bản phát hành lỗi nên cài đặt phải được sử dụng thay thế, nhưng không bao giờ ý định ai đó cố ý vô hiệu hóa hành vi mới.

Hành vi mới có để bảo vệ chống lại loại sự cố này xảy ra và cài đặt tương thích ngược có thể bị xóa. Tôi đề nghị bạn tìm một số cách khác để xử lý các lỗi ở đây (và tôi sẽ không quan tâm đến đề xuất nếu bạn có thể tạo ra một api tốt cho nó)

+0

Làm cách nào để có được kết quả của nhiệm vụ tốt trong error_callback? – Carl

+0

@Carl Tôi không chắc chắn 100% nhưng tôi không nghĩ rằng bạn có thể. Tôi nghĩ rằng các thuộc tính duy nhất bạn có thể nhận được là Ngoại lệ và Traceback của nhiệm vụ thất bại.Bạn có thể sử dụng một kho dữ liệu nếu bạn cần một cái gì đó cụ thể để được lấy về sau ngay cả khi mọi thứ thất bại. Chúng tôi chỉ cần nó để gửi và gửi email vì vậy tôi đã không chơi quá nhiều với điều đó. – alejandrodnm

+0

Theo mã chấp nhận, tôi nhận được lỗi gọi lại, nhưng hàm hợp âm vẫn tăng ngoại lệ, không trả về giá trị từ lỗi gọi lại ... – Wesley

Các vấn đề liên quan