Xóa tất cả các tác vụ đang chờ xử lý trong cần tây / rabbitmq


199

Làm cách nào tôi có thể xóa tất cả các tác vụ đang chờ xử lý mà không biết task_idcho từng tác vụ?

Câu trả lời:


296

Từ các tài liệu :

$ celery -A proj purge

hoặc là

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

(EDIT: Cập nhật với phương thức hiện tại.)


56
Hoặc, từ Django, cho cần tây 3.0+: manage.py celery purge( celeryctlhiện không dùng nữa và sẽ biến mất trong 3.1).
Henrik Heimbuerger

3
Tôi tìm thấy câu trả lời này để tìm cách làm điều này với một phụ trợ redis. Phương pháp tốt nhất tôi tìm thấy là phương pháp redis-cli KEYS "celery*" | xargs redis-cli DELlàm việc cho tôi. Điều này sẽ xóa sạch tất cả các tác vụ được lưu trữ trên phụ trợ redis bạn đang sử dụng.
Melignus

1
Làm thế nào tôi có thể làm điều này trong cần tây 3.0?
luistm

2
Đối với tôi, nó chỉ đơn giản là celery purge(bên trong env ảo có liên quan). Ooops - có một câu trả lời tương tự bên dưới ..... stackoverflow.com/a/20404976/1213425
Erve1879

Đối với Celery 4.0+ kết hợp với Django, một lần nữa lệnh này, trong đó đối số -Alà ứng dụng Django celery.pycó vị trí.
gitaarik

120

Đối với cần tây 3.0+:

$ celery purge

Để thanh lọc một hàng đợi cụ thể:

$ celery -Q queue_name purge

9
Nếu bạn gặp lỗi kết nối, hãy đảm bảo bạn chỉ định ứng dụng, vd celery -A proj purge.
Kamil Sindi

25

Đối với cần tây 2.x và 3.x:

Khi sử dụng worker với tham số -Q để xác định hàng đợi, ví dụ

celery worker -Q queue1,queue2,queue3

sau đó celery purgesẽ không hoạt động, bởi vì bạn không thể truyền tham số hàng đợi cho nó. Nó sẽ chỉ xóa hàng đợi mặc định. Giải pháp là bắt đầu công nhân của bạn với --purgetham số như thế này:

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

Điều này tuy nhiên sẽ chạy công nhân.

Tùy chọn khác là sử dụng tiểu ban amqp của cần tây

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

Có, đây là phiên bản cũ hơn (2.x và có thể 3.x) của cần tây. Tôi không thể chỉnh sửa câu trả lời
smido


9

Tôi thấy rằng celery purgenó không hoạt động cho cấu hình cần tây phức tạp hơn của tôi. Tôi sử dụng nhiều hàng đợi được đặt tên cho các mục đích khác nhau:

$ 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

Cột đầu tiên là tên hàng đợi, cột thứ hai là số lượng tin nhắn đang chờ trong hàng đợi và cột thứ ba là số lượng người nghe cho hàng đợi đó. Các hàng đợi là:

  • Cần tây - Xếp hàng cho các nhiệm vụ cần tây tiêu chuẩn, bình thường
  • apns - Hàng đợi cho các nhiệm vụ Dịch vụ Thông báo Đẩy của Apple, không hoàn toàn như idempotent
  • phân tích - Hàng đợi để phân tích hàng đêm chạy dài
  • * .pidbox - Hàng đợi cho các lệnh worker, chẳng hạn như tắt và đặt lại, một cho mỗi worker (2 worker celery, one apns worker, one worker worker)
  • bcast. * - Phát hàng đợi, để gửi tin nhắn cho tất cả nhân viên nghe hàng đợi (thay vì chỉ người đầu tiên lấy nó)
  • celeryev. * - Hàng đợi sự kiện cần tây, để báo cáo phân tích nhiệm vụ

Nhiệm vụ phân tích là một nhiệm vụ mạnh mẽ hoạt động tốt trên các tập dữ liệu nhỏ, nhưng giờ mất hơn 24 giờ để xử lý. Đôi khi, một cái gì đó sẽ đi sai và nó sẽ bị kẹt chờ đợi trên cơ sở dữ liệu. Nó cần phải được viết lại, nhưng cho đến lúc đó, khi nó bị kẹt, tôi giết nhiệm vụ, làm trống hàng đợi và thử lại. Tôi phát hiện "sự bế tắc" bằng cách xem số lượng tin nhắn cho hàng phân tích, sẽ là 0 (phân tích đã hoàn thành) hoặc 1 (chờ phân tích tối qua kết thúc). 2 hoặc cao hơn là xấu, và tôi nhận được một email.

celery purge đề nghị xóa các tác vụ khỏi một trong các hàng đợi phát sóng và tôi không thấy tùy chọn để chọn một hàng đợi có tên khác.

Đây là quá trình của tôi:

$ 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

Không phải là một câu trả lời, phải không? Rất nhiều thông tin tuy nhiên!
Amn

4
celeryctl purgekhông làm việc với hàng đợi được đặt tên. python manage.py celery amqp queue.purge <queue_name>đã làm. Tôi nghĩ bối cảnh này hữu ích cho những người có thiết lập phức tạp, vì vậy họ có thể tìm ra những gì họ cần làm nếu celeryctl purgethất bại đối với họ.
jwhitlock

Tôi không thể tìm thấy manage.pytrong Celery 3.1.17 của mình, tập tin đã bị xóa hay chỉ mới đánh đòn? Tuy nhiên, tôi đã tìm thấy giao diện tương ứng ( queue.purge) */bin/amqp.py. Nhưng sau khi cố gắng tương quan nội dung của tệp với tài liệu, tôi phải thừa nhận một cách đáng tiếc rằng Celery không có giấy tờ rõ ràng và cũng là một tác phẩm rất phức tạp, ít nhất là đánh giá nó bằng mã nguồn của nó.
Amn

manage.pylà tập lệnh quản lý Django và manage.py celerychạy cần tây sau khi tải cấu hình từ cài đặt Django. Tôi chưa sử dụng cần tây bên ngoài Django, nhưng celerylệnh được bao gồm có thể là thứ bạn đang tìm kiếm: celery.readthedocs.org/en/latest/userguide/monitoring.html
jwhitlock

5

Trong cần tây 3+

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

CLI

Thanh lọc tên hàng đợi:

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

Thanh lọc cấu hình hàng đợi

celery -A proj purge

Tôi đã thanh lọc các tin nhắn, nhưng vẫn còn các tin nhắn trong hàng đợi? Trả lời: Nhiệm vụ được xác nhận (xóa khỏi hàng đợi) ngay khi chúng thực sự được thực thi. Sau khi công nhân đã nhận được một nhiệm vụ, sẽ mất một thời gian cho đến khi nó thực sự được thực thi, đặc biệt là nếu có rất nhiều nhiệm vụ đang chờ thực thi. Các thông báo không được xác nhận sẽ được giữ bởi nhân viên cho đến khi nó đóng kết nối với nhà môi giới (máy chủ AMQP). Khi kết nối đó bị đóng (ví dụ: do công nhân bị dừng), các tác vụ sẽ được người môi giới gửi lại cho nhân viên có sẵn tiếp theo (hoặc cùng một công nhân khi nó được khởi động lại), vì vậy, hãy lọc sạch hàng đợi các tác vụ đang chờ bạn phải dừng tất cả các công nhân, và sau đó thanh lọc các tác vụ bằng celery.control.purge ().

Vì vậy, để thanh lọc toàn bộ công nhân xếp hàng phải được dừng lại.


5

Nếu bạn muốn xóa tất cả các tác vụ đang chờ xử lý và cả các tác vụ đang hoạt động và dành riêng để ngăn chặn hoàn toàn Celery, đây là công việc phù hợp với tôi:

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)

2

1. Để thanh lọc chính xác hàng đợi của các nhiệm vụ đang chờ, bạn phải dừng tất cả các công nhân ( http://celery.readthedocs.io/en/latest/faq.html#i-ve-purged-messages-but-there-are- still-message-left-in-the-queue ):

$ sudo rabbitmqctl stop

hoặc (trong trường hợp RabbitMQ / nhà môi giới tin nhắn được giám sát bởi Người giám sát):

$ sudo supervisorctl stop all

2. ... và sau đó lọc các tác vụ khỏi một hàng đợi cụ thể:

$ cd <source_dir>
$ celery amqp queue.purge <queue name>

3. Bắt đầu RabbitMQ:

$ sudo rabbitmqctl start

hoặc (trong trường hợp RabbitMQ được giám sát bởi Người giám sát):

$ sudo supervisorctl start all

2

cần tây 4+ lệnh thanh lọc cần tây để thanh lọc tất cả các hàng đợi nhiệm vụ được cấu hình

celery -A *APPNAME* purge

lập trình:

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

tất cả các nhiệm vụ đang chờ xử lý sẽ bị thanh trừng. Tham khảo: cần tây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.