Tạo một AsyncResultđối tượng từ id nhiệm vụ là cách được đề xuất trong Câu hỏi thường gặp để có được trạng thái nhiệm vụ khi thứ duy nhất bạn có là id nhiệm vụ.
Tuy nhiên, đối với Celery 3.x, có những lưu ý đáng kể là có thể cắn người nếu họ không chú ý đến chúng. Nó thực sự phụ thuộc vào từng trường hợp sử dụng cụ thể.
Theo mặc định, Celery không ghi lại trạng thái "đang chạy".
Để Celery ghi lại rằng một tác vụ đang chạy, bạn phải đặt task_track_startedthành True. Đây là một nhiệm vụ đơn giản kiểm tra điều này:
@app.task(bind=True)
def test(self):
print self.AsyncResult(self.request.id).state
Khi task_track_startedlà False, đó là mặc định, chương trình nhà nước là PENDINGmặc dù nhiệm vụ đã bắt đầu. Nếu bạn đặt task_track_startedthành True, thì trạng thái sẽ là STARTED.
Trạng thái PENDINGcó nghĩa là "Tôi không biết."
An AsyncResultvới bang PENDINGkhông có ý nghĩa gì hơn là Celery không biết tình trạng của nhiệm vụ. Điều này có thể là do bất kỳ lý do nào.
Đối với một điều, AsyncResultcó thể được xây dựng với id nhiệm vụ không hợp lệ. Những "nhiệm vụ" như vậy sẽ được Celery coi là đang chờ xử lý:
>>> task.AsyncResult("invalid").status
'PENDING'
Ok, vì vậy không ai sẽ cung cấp các id rõ ràng không hợp lệ cho AsyncResult. Công bằng, nhưng nó cũng có hiệu lực mà AsyncResultcũng sẽ coi một nhiệm vụ đã chạy thành công nhưng Celery đó đã quên như hiện tại PENDING. Một lần nữa, trong một số trường hợp sử dụng, điều này có thể là một vấn đề. Một phần của vấn đề xoay quanh cách Celery được cấu hình để giữ kết quả của các nhiệm vụ, vì nó phụ thuộc vào tính khả dụng của "bia mộ" trong phần phụ trợ kết quả. ("Tombstone" là thuật ngữ sử dụng trong tài liệu Celery cho các phần dữ liệu ghi lại cách nhiệm vụ đã kết thúc.) Việc sử dụng AsyncResultsẽ không hoạt động nếu task_ignore_resultcó True. Một vấn đề khó chịu hơn là Celery sẽ hết hạn sử dụng bia mộ theo mặc định. Cácresult_expirescài đặt theo mặc định được đặt thành 24 giờ. Vì vậy, nếu bạn khởi chạy một tác vụ và ghi lại id trong bộ nhớ lâu dài và hơn 24 giờ sau, bạn tạo một tác vụ AsyncResultvới nó, trạng thái sẽ là PENDING.
Tất cả các "nhiệm vụ thực" bắt đầu ở PENDINGtrạng thái. Vì vậy, nhận PENDINGmột nhiệm vụ có thể có nghĩa là nhiệm vụ đã được yêu cầu nhưng không bao giờ tiến triển hơn mức này (vì bất kỳ lý do gì). Hoặc nó có thể có nghĩa là nhiệm vụ đã chạy nhưng Celery quên trạng thái của nó.
Ôi chao! AsyncResultsẽ không hiệu quả với tôi. Tôi có thể làm gì nữa?
Tôi thích theo dõi các mục tiêu hơn là theo dõi các nhiệm vụ . Tôi giữ một số thông tin nhiệm vụ nhưng nó thực sự là thứ yếu để theo dõi các mục tiêu. Các mục tiêu được lưu trữ trong bộ lưu trữ độc lập với Celery. Khi một yêu cầu cần thực hiện tính toán phụ thuộc vào một số mục tiêu đã đạt được, nó sẽ kiểm tra xem mục tiêu đã đạt được chưa, nếu có, thì nó sẽ sử dụng mục tiêu được lưu trong bộ nhớ cache này, nếu không, nó sẽ bắt đầu tác vụ sẽ thực hiện mục tiêu và gửi đến máy khách đã thực hiện yêu cầu HTTP một phản hồi cho biết nó sẽ đợi kết quả.
Các tên biến và siêu liên kết ở trên dành cho Celery 4.x. Trong 3.x các biến tương ứng và siêu liên kết là: CELERY_TRACK_STARTED, CELERY_IGNORE_RESULT, CELERY_TASK_RESULT_EXPIRES.
xthì sao?