programing

셀러리로 이미 실행 중인 작업을 취소하시겠습니까?

padding 2023. 9. 10. 11:58
반응형

셀러리로 이미 실행 중인 작업을 취소하시겠습니까?

문서를 읽고 검색해 보았지만 정확한 답을 찾을 수 없는 것 같습니다.

이미 실행 중인 작업을 취소할 수 있습니까?(작업이 시작되었을 때와 마찬가지로, 시간이 좀 걸리고, 작업을 절반 정도 진행한 후 취소해야 함)

셀러리 FAQ에 있는 서류에서 이걸 발견했어요.

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

그러나 이렇게 하면 대기열에 있는 작업이 취소될지 아니면 작업자의 실행 프로세스가 중단될지는 확실하지 않습니다.빛을 발할 수 있는 모든 것에 감사드립니다!

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

https://deller.celeryq.dev/en/weller/userguide/workers.https:/worker-persistent-revokes

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

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

https://graphics.celeryq.dev/en/graphics/userguide/workers.https:/graphics-revocation-workers.

Celery 3.1에서는 작업 취소의 API가 변경됩니다.

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

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

또는 태스크 ID만 있는 경우:

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

@0x00mh의 답은 맞지만, 최근 셀러리 문서들은 그것을 사용하는 것은terminate옵션은 "관리자를 위한 마지막 수단"입니다. 왜냐하면 그 사이에 실행을 시작한 다른 작업을 실수로 종료할 수 있기 때문입니다.어쩌면 더 나은 해결책은terminate=True와 함께signal='SIGUSR1'(SoftTimeLimit의 원인이 됨)작업에서 제기할 예외를 초과했습니다).

5.2.3 설명서에 따라 다음 명령을 실행할 수 있습니다.

    celery.control.revoke(task_id, terminate=True, signal='SIGKILL')

어디에celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])

문서 링크: https://docs.celeryq.dev/en/stable/reference/celery.app.control.html?highlight=highlight#celery.app.control.revoke

또한 불만족스럽게도 작업을 중지할 수 있는 또 다른 방법(복잡한 작업)이 있지만 신뢰할 수 없는 것이 많습니다. 자세한 내용은 다음을 참조하십시오. http://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable.html

브로커와 함께 셀러리 앱을 정의하고 백엔드하면 다음과 같습니다.

from celery import Celery
celeryapp = Celery('app', broker=redis_uri, backend=redis_uri)

보내기 작업을 실행하면 작업에 대한 고유 ID를 반환합니다.

task_id = celeryapp.send_task('run.send_email', queue = "demo")

작업을 취소하려면 셀러리 앱과 작업 ID가 필요합니다.

celeryapp.control.revoke(task_id, terminate=True)
from celery.app import default_app

revoked = default_app.control.revoke(task_id, terminated=True, signal='SIGKILL')
print(revoked)

작업에 대해서는 time_limit, soft_time_limit(또는 작업자용으로 설정 가능) 옵션을 참조하십시오.실행 시간만 제어하려면 apply_async 메서드의 expires 인수를 참조하십시오.

언급URL : https://stackoverflow.com/questions/8920643/cancel-an-already-executing-task-with-celery

반응형