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ó)
Tôi đang tìm giải pháp này. –