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_started
thà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_started
là False
, đó là mặc định, chương trình nhà nước là PENDING
mặc dù nhiệm vụ đã bắt đầu. Nếu bạn đặt task_track_started
thành True
, thì trạng thái sẽ là STARTED
.
Trạng thái PENDING
có nghĩa là "Tôi không biết."
An AsyncResult
với bang PENDING
khô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, AsyncResult
có 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à AsyncResult
cũ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 AsyncResult
sẽ không hoạt động nếu task_ignore_result
có 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_expires
cà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ụ AsyncResult
với nó, trạng thái sẽ là PENDING
.
Tất cả các "nhiệm vụ thực" bắt đầu ở PENDING
trạng thái. Vì vậy, nhận PENDING
mộ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! AsyncResult
sẽ 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
.
x
thì sao?