셀러리로 이미 실행 중인 작업을 취소하시겠습니까?
문서를 읽고 검색해 보았지만 정확한 답을 찾을 수 없는 것 같습니다.
이미 실행 중인 작업을 취소할 수 있습니까?(작업이 시작되었을 때와 마찬가지로, 시간이 좀 걸리고, 작업을 절반 정도 진행한 후 취소해야 함)
>>> 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
'programing' 카테고리의 다른 글
필드를 증가시킬 때 MySQL 데이터베이스에 레이스 조건이 없는지 확인하는 방법은 무엇입니까? (0) | 2023.09.10 |
---|---|
모든 개발자가 데이터베이스에 대해 알아야 할 사항은 무엇입니까? (0) | 2023.09.10 |
jQuery 컨테이너 자체를 포함한 컨테이너의 HTML 가져오기 (0) | 2023.09.05 |
Git Pull 후 코드 변경을 확인하는 방법은 무엇입니까? (0) | 2023.09.05 |
MYSQL: 테이블 "bar"에 문자열 "foo"가 포함된 모든 행 삭제 (0) | 2023.09.05 |