Câu trả lời:
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.)
redis-cli KEYS "celery*" | xargs redis-cli DEL
là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.
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
-A
là ứng dụng Django celery.py
có vị trí.
Đố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
celery -A proj purge
.
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 purge
sẽ 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 --purge
tham 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
Trong cần tây 3+:
CLI:
$ celery -A proj purge
Có lập trình:
>>> from proj.celery import app
>>> app.control.purge()
http://docs.celeryproject.org/en/latest/faq.html#how-do-i-purge-all-waiting-t task
Tôi thấy rằng celery purge
nó 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à:
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
celeryctl purge
khô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 purge
thất bại đối với họ.
manage.py
trong 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ó.
manage.py
là tập lệnh quản lý Django và manage.py celery
chạ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 celery
lệnh được bao gồm có thể là thứ bạn đang tìm kiếm: celery.readthedocs.org/en/latest/userguide/monitoring.html
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.
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)
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
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
manage.py celery purge
(celeryctl
hiện không dùng nữa và sẽ biến mất trong 3.1).