Celery에서 이미 실행중인 작업을 취소 하시겠습니까?


96

나는 문서를 읽고 검색했지만 정답을 찾을 수없는 것 같습니다.

이미 실행중인 작업을 취소 할 수 있습니까? (작업이 시작되었으므로 시간이 걸리며 작업을 반쯤 취소해야 함)

Celery FAQ 의 문서에서 찾았습니다.

>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()

그러나 이것이 대기중인 작업을 취소할지 아니면 작업자에서 실행중인 프로세스를 종료할지 확실하지 않습니다. 빛을 비추어 주셔서 감사합니다!

답변:


185

revoke 는 작업 실행을 취소합니다. 작업이 취소되면 작업자는 작업을 무시하고 실행하지 않습니다. 영구 취소를 사용하지 않으면 작업자가 다시 시작한 후에 작업을 실행할 수 있습니다.

http://docs.celeryproject.org/en/latest/userguide/workers.html#worker-persistent-revokes

revoke에는 기본적으로 False 인 종료 옵션이 있습니다. 실행중인 작업을 종료해야하는 경우 종료를 True 로 설정해야합니다 .

>>> from celery.task.control import revoke
>>> revoke(task_id, terminate=True)

http://docs.celeryproject.org/en/latest/userguide/workers.html#revoke-revoking-tasks


3
이것이 제가 찾던 설명입니다. 감사합니다!
dcoffey3296

1
분산 환경에서 작동합니까? 작업을 실행하는 여러 컴퓨터에 작업자가 있다는 의미입니다. 셀러리는 작업이 실행되는 시스템을 추적합니까?
ksrini

1
그렇습니다. 작업자와의 통신은 브로커를 통해 이루어집니다.
mher

5
result.revoke (terminate = True)는 revoke (task_id, terminate = True)와 동일한 작업을 수행해야합니다.
CamHart 2014

10
또한 최신 Celery 문서에 따르면 종료 옵션을 사용하는 것은 "관리자를위한 최후의 수단"입니다. 해당 작업자에서 최근에 시작된 다른 작업을 종료 할 위험이 있습니다.
kouk

38

Celery 3.1에서는 작업 취소 API 가 변경되었습니다.

Celery FAQ 에 따르면 result.revoke를 사용해야합니다.

>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()

또는 작업 ID 만있는 경우 :

>>> from proj.celery import app
>>> app.control.revoke(task_id)

25

@ 0x00mh의 대답은 맞지만 최근 셀러리 문서 에서는 그 동안 실행을 시작한 다른 작업을 실수로 종료 할 수 있기 때문에이 terminate옵션 을 사용하는 것이 " 관리자를위한 최후의 수단 " 이라고 말합니다 . 아마도 더 나은 솔루션은 다음과 결합하는 것 terminate=True입니다 signal='SIGUSR1'(작업에서 SoftTimeLimitExceeded 예외가 발생하도록 함).


2
이 솔루션은 저에게 매우 효과적이었습니다. SoftTimeLimitExceeded내 작업에서가 발생 하면 내 사용자 지정 정리 논리 ( try/ except/ 를 통해 구현 됨 finally)가 호출됩니다. 제 생각에는 이것이 AbortableTask제공하는 것보다 훨씬 낫습니다 ( docs.celeryproject.org/en/latest/reference/… ). 후자를 사용하면 데이터베이스 결과 백엔드를 필요로 하고 수동 반복이 중단 된 것 있는지 확인하기 위해 진행중인 작업의 상태를 확인해야합니다.
David Schneider

2
프로세스에 의해 선택되는 다른 작업이 있는지 이해하는 한 이것이 더 낫습니다. 어쨌든 중지 될 것이고 다른 예외가 throw됩니다.
marxin

worker_prefetch_multiplier = 1오래 실행되는 작업이 몇 개 있기 때문에 사용 하는 경우 종료해도 괜찮을 것입니다. 다른 작업은 종료로 인해 영향을받지 않기 때문입니다.이게 맞습니까? @spicyramen
maffe

1

작업에 대한 다음 옵션을 참조하십시오. time_limit , soft_time_limit (또는 작업자에 대해 설정할 수 있음). 실행 시간뿐만 아니라 apply_async 메서드의 expires 인수 를 참조하십시오 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.