만들기 AsyncResult
작업 ID와 객체 것은 입니다 에서 권장하는 방법 자주 묻는 질문 당신이 가진 유일한 것은 작업 ID입니다 때 작업 상태를 얻을.
그러나 Celery 3.x부터는 사람들이주의를 기울이지 않으면 물릴 수있는 중요한주의 사항이 있습니다. 실제로 특정 사용 사례 시나리오에 따라 다릅니다.
기본적으로 Celery는 "실행 중"상태를 기록하지 않습니다.
위해 셀러리는 작업이 실행되는 것을 기록하기 위해, 당신은 설정해야합니다 task_track_started
으로 True
. 다음은이를 테스트하는 간단한 작업입니다.
@app.task(bind=True)
def test(self):
print self.AsyncResult(self.request.id).state
때 task_track_started
입니다 False
기본 인, 상태 표시는 PENDING
작업이 시작에도 불구하고. 사용자가 설정 한 경우 task_track_started
에 True
, 그 상태가 될 것입니다 STARTED
.
상태 PENDING
는 "모름"을 의미합니다.
AsyncResult
상태로는 PENDING
더 셀러리는 작업의 상태를 모르는 것보다 것을하지 평균 아무것도 않습니다. 이것은 여러 가지 이유 때문일 수 있습니다.
우선 AsyncResult
잘못된 작업 ID로 구성 할 수 있습니다. 이러한 "작업"은 Celery에서 보류중인 것으로 간주됩니다.
>>> task.AsyncResult("invalid").status
'PENDING'
좋아, 아무도 분명히 유효하지 않은 ID를 AsyncResult
. 충분히 AsyncResult
공평하지만 성공적으로 실행되었지만 Celery가 잊혀진 작업을 고려하는PENDING
효과도 있습니다 . 다시 말하지만, 일부 사용 사례 시나리오에서는 이것이 문제가 될 수 있습니다. 문제의 일부는 결과 백엔드에서 "삭제 표시"의 가용성에 따라 다르기 때문에 작업 결과를 유지하도록 Celery를 구성하는 방법에 달려 있습니다. ( "묘비는"기록이 작업이 어떻게 끝났는지하는 데이터 청크에 대한 셀러리 설명서의 용어 사용이다.)를 사용 AsyncResult
하면 전혀하지 않습니다 일 task_ignore_result
입니다 True
. 더 짜증나는 문제는 셀러리가 기본적으로 삭제 표시를 만료한다는 것입니다. 그만큼result_expires
기본 설정은 24 시간으로 설정됩니다. 따라서 작업을 시작하고 장기 저장소에 ID를 기록하고 24 시간 후에 작업을 생성 AsyncResult
하면 상태는 PENDING
.
모든 "실제 작업"은 PENDING
주 에서 시작됩니다 . 따라서 PENDING
작업을 수행한다는 것은 작업이 요청되었지만 (어떤 이유로 든) 이보다 더 진행되지 않았 음을 의미 할 수 있습니다. 또는 작업이 실행되었지만 Celery가 상태를 잊어 버렸음을 의미 할 수 있습니다.
아야! AsyncResult
나를 위해 작동하지 않습니다. 그 밖에 무엇을 할 수 있습니까?
작업 자체를 추적하는 것보다 목표를 추적하는 것을 선호 합니다 . 나는 몇 가지 작업 정보를 유지하지만 목표를 추적하는 것은 정말 부차적입니다. 목표는 셀러리와는 독립적 인 저장소에 저장됩니다. 요청이 계산을 수행해야 할 때 달성 된 목표에 따라 달라지며, 목표가 이미 달성되었는지 확인하고, 그렇다면이 캐시 된 목표를 사용하고, 그렇지 않으면 목표에 영향을 미칠 작업을 시작하고 HTTP 요청을 한 클라이언트가 결과를 기다려야 함을 나타내는 응답입니다.
위의 변수 이름과 하이퍼 링크는 Celery 4.x 용입니다. 3.X에 대응하는 변수와 하이퍼 링크이다 : CELERY_TRACK_STARTED
, CELERY_IGNORE_RESULT
, CELERY_TASK_RESULT_EXPIRES
.
x
어떻게합니까?