[task] 셀러리 / bunnymq에서 보류중인 모든 작업 삭제

task_id각 작업에 대한 정보 를 모르고 보류중인 모든 작업을 어떻게 삭제 합니까?



답변

로부터 문서 :

$ celery -A proj purge

또는

from proj.celery import app
app.control.purge()

(편집 : 현재 방법으로 업데이트되었습니다.)


답변

셀러리 3.0 이상 :

$ celery purge

특정 대기열을 제거하려면

$ celery -Q queue_name purge


답변

Celery 2.x 및 3.x의 경우 :

예를 들어 -Q 매개 변수와 함께 worker를 사용하여 큐를 정의하는 경우

celery worker -Q queue1,queue2,queue3

그때 celery purge 당신이 그것에 큐 PARAMS을 통과 할 수 없기 때문에, 작동하지 않습니다. 기본 대기열 만 삭제합니다. 해결책은 다음과 --purge같은 매개 변수로 작업자를 시작하는 것입니다 .

celery worker -Q queue1,queue2,queue3 --purge

그러나 이것은 노동자를 운영합니다.

다른 옵션은 셀러리의 amqp 부속 명령을 사용하는 것입니다

celery amqp queue.delete queue1
celery amqp queue.delete queue2
celery amqp queue.delete queue3


답변

셀러리 3 이상에서 :

CLI :

$ celery -A proj purge

프로그래밍 방식으로 :

>>> from proj.celery import app
>>> app.control.purge()

http://docs.celeryproject.org/en/latest/faq.html#how-do-i-purge-all-waiting-tasks


답변

그 발견 celery purge내 더 복잡한 셀러리 설정 작동하지 않습니다. 다른 목적으로 여러 개의 명명 된 대기열을 사용합니다.

$ sudo rabbitmqctl list_queues -p celery name messages consumers
Listing queues ...  # Output sorted, whitespaced for readability
celery                                          0   2
celery@web01.celery.pidbox                      0   1
celery@web02.celery.pidbox                      0   1
apns                                            0   1
apns@web01.celery.pidbox                        0   1
analytics                                       1   1
analytics@web01.celery.pidbox                   0   1
bcast.361093f1-de68-46c5-adff-d49ea8f164c0      0   1
bcast.a53632b0-c8b8-46d9-bd59-364afe9998c1      0   1
celeryev.c27b070d-b07e-4e37-9dca-dbb45d03fd54   0   1
celeryev.c66a9bed-84bd-40b0-8fe7-4e4d0c002866   0   1
celeryev.b490f71a-be1a-4cd8-ae17-06a713cc2a99   0   1
celeryev.9d023165-ab4a-42cb-86f8-90294b80bd1e   0   1

첫 번째 열은 큐 이름이고 두 번째 열은 큐에서 대기중인 메시지 수이고 세 번째 열은 해당 큐의 리스너 수입니다. 대기열은 다음과 같습니다.

  • 셀러리-표준 dem 등성 셀러리 작업 대기열
  • apns-Push 등원이 아닌 Apple 푸시 알림 서비스 작업 대기열
  • 분석-야간 야간 분석을위한 대기열
  • * .pidbox-종료 및 재설정과 같은 작업자 명령에 대한 대기열, 작업 자당 하나씩 (셀러리 작업자 2 명, apns 작업자 1 명, 분석 작업자 1 명)
  • bcast. *-브로드 캐스트 큐 (큐를 잡는 것이 아니라 큐를 수신하는 모든 작업자에게 메시지 보내기)
  • celeryev. *-작업 분석보고를위한 Celery 이벤트 큐

분석 작업은 소규모 데이터 세트에서 훌륭하게 작동했지만 이제 처리하는 데 24 시간 이상이 걸립니다. 간혹 무언가가 잘못되어 데이터베이스를 기다리면서 멈출 수 있습니다. 다시 작성해야하지만 그 때까지 멈 추면 작업을 종료하고 대기열을 비운 다음 다시 시도하십시오. 분석 대기열의 메시지 수 (0 (종료 된 분석)) 또는 1 (어제 밤의 분석이 완료되기를 기다리는)을보고 “고착”을 감지합니다. 2 이상은 나쁘고 이메일을받습니다.

celery purge 브로드 캐스트 대기열 중 하나에서 작업을 지우도록 제안했지만 다른 명명 된 대기열을 선택하는 옵션이 표시되지 않습니다.

내 과정은 다음과 같습니다.

$ sudo /etc/init.d/celeryd stop  # Wait for analytics task to be last one, Ctrl-C
$ ps -ef | grep analytics  # Get the PID of the worker, not the root PID reported by celery
$ sudo kill <PID>
$ sudo /etc/init.d/celeryd stop  # Confim dead
$ python manage.py celery amqp queue.purge analytics
$ sudo rabbitmqctl list_queues -p celery name messages consumers  # Confirm messages is 0
$ sudo /etc/init.d/celeryd start


답변

셀러리 3 이상

http://docs.celeryproject.org/en/3.1/faq.html#how-do-i-purge-all-waiting-tasks

CLI

명명 된 대기열 제거 :

 celery -A proj amqp queue.purge <queue name>

구성된 큐 제거

celery -A proj purge

메시지를 제거했지만 대기열에 여전히 메시지가 남아 있습니까? 답변 : 작업이 실제로 실행되는 즉시 작업이 승인됩니다 (대기열에서 제거됨). 작업자가 작업을받은 후에는 실제로 이미 실행 대기중인 작업이 많은 경우 실제로 실행될 때까지 시간이 걸립니다. 승인되지 않은 메시지는 브로커 (AMQP 서버)에 대한 연결을 닫을 때까지 작업자가 보류합니다. 연결이 닫히면 (예 : 작업자가 중지되어) 브로커가 다음 사용 가능한 작업자 (또는 다시 시작했을 때 동일한 작업자)에게 작업을 다시 보내므로 대기중인 작업 대기열을 올바르게 제거합니다. 모든 작업자를 중지 한 다음 celery.control.purge ()를 사용하여 작업을 제거해야합니다.

따라서 전체 큐 작업자를 제거하려면 중지해야합니다.


답변

Celery를 완전히 중지하기 위해 보류중인 모든 작업과 활성 및 예약 된 작업을 제거하려면 다음과 같이하십시오.

from proj.celery import app
from celery.task.control import inspect, revoke

# remove pending tasks
app.control.purge()

# remove active tasks
i = inspect()
jobs = i.active()
for hostname in jobs:
    tasks = jobs[hostname]
    for task in tasks:
        revoke(task['id'], terminate=True)

# remove reserved tasks
jobs = i.reserved()
for hostname in jobs:
    tasks = jobs[hostname]
    for task in tasks:
        revoke(task['id'], terminate=True)