การลบภารกิจที่ค้างอยู่ทั้งหมดใน celery / rabbitmq


คำตอบ:


297

จากเอกสาร :

$ celery -A proj purge

หรือ

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

(แก้ไข: อัปเดตด้วยวิธีปัจจุบัน)


56
หรือจาก Django สำหรับคื่นฉ่าย 3.0+: manage.py celery purge( celeryctlเลิกใช้แล้วและจะหายไปใน 3.1)
Henrik Heimbuerger

3
ฉันพบคำตอบนี้กำลังมองหาวิธีการทำกับแบ็กเอนด์สีแดง วิธีที่ดีที่สุดที่ฉันพบคือredis-cli KEYS "celery*" | xargs redis-cli DELสิ่งที่ได้ผลสำหรับฉัน สิ่งนี้จะลบงานทั้งหมดที่เก็บไว้ในแบ็กเอนด์สีแดงที่คุณใช้
Melignus

1
ฉันจะทำสิ่งนี้ได้อย่างไรในคื่นฉ่าย 3.0
luistm

2
สำหรับฉันมันเป็นเพียงcelery purge(ภายใน env เสมือนที่เกี่ยวข้อง) Ooops - มีคำตอบเหมือนด้านล่าง ..... stackoverflow.com/a/20404976/1213425
Erve1879

สำหรับ Celery 4.0+ ร่วมกับ Django มันเป็นคำสั่งนี้อีกครั้งโดยที่อาร์กิวเมนต์-Aคือแอป Django ที่celery.pyเป็นที่ตั้งของ
gitaarik

120

สำหรับคื่นฉ่าย 3.0+:

$ celery purge

วิธีล้างคิวเฉพาะ:

$ celery -Q queue_name purge

9
celery -A proj purgeถ้าคุณได้รับข้อผิดพลาดการเชื่อมต่อให้แน่ใจว่าคุณระบุแอปเช่น
Kamil Sindi

25

สำหรับ Celery 2.x และ 3.x:

เมื่อใช้ผู้ทำงานกับพารามิเตอร์ -Q เพื่อกำหนดคิวตัวอย่างเช่น

celery worker -Q queue1,queue2,queue3

จากนั้นcelery purgeจะไม่ทำงานเนื่องจากคุณไม่สามารถส่งต่อพารามิเตอร์ไปยังคิวได้ มันจะลบเฉพาะคิวเริ่มต้น วิธีแก้ปัญหาคือเริ่มต้นพนักงานด้วย--purgeพารามิเตอร์ดังนี้

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

อย่างไรก็ตามสิ่งนี้จะเรียกใช้คนงาน

ตัวเลือกอื่น ๆ คือการใช้คำสั่งย่อย amqp ของคื่นฉ่าย

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

ใช่นี่สำหรับรุ่นขึ้นฉ่าย (2.x และอาจ 3.x) รุ่นเก่า ฉันไม่สามารถแก้ไขคำตอบได้
smido


9

ฉันพบ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

คอลัมน์แรกคือชื่อคิวที่สองคือจำนวนข้อความที่รออยู่ในคิวและที่สามคือจำนวนผู้ฟังสำหรับคิวนั้น คิวคือ:

  • คื่นฉ่าย - คิวสำหรับงานคื่นฉ่ายมาตรฐาน idempotent
  • apns - คิวสำหรับงานบริการการแจ้งเตือนของ Apple Push ไม่ใช่ idempotent
  • การวิเคราะห์ - คิวสำหรับการวิเคราะห์ที่ยาวนานทุกคืน
  • * .pidbox - คิวสำหรับคำสั่งของผู้ปฏิบัติงานเช่นการปิดและรีเซ็ตหนึ่งรายการต่อผู้ปฏิบัติงาน (2 คนงานขึ้นฉ่าย 2 คนหนึ่งคนงาน apns คนงานวิเคราะห์คนหนึ่ง)
  • 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

ไม่ใช่คำตอบใช่มั้ย ข้อมูลมาก แต่!
พฤศจิกายน

4
celeryctl purgeไม่ทำงานกับคิวที่มีชื่อ python manage.py celery amqp queue.purge <queue_name>เคยทำ. ฉันคิดว่าบริบทมีประโยชน์สำหรับผู้ที่มีการตั้งค่าที่ซับซ้อนดังนั้นพวกเขาจึงสามารถรู้ได้ว่าต้องทำอะไรหากceleryctl purgeล้มเหลว
jwhitlock

ฉันหาmanage.pyCelery 3.1.17 ไม่พบไฟล์ถูกลบหรือเพิ่งตีใหม่? ผมพบว่าสิ่งที่ดูเหมือนว่าอินเตอร์เฟซที่สอดคล้องกัน ( queue.purge) ใน*/bin/amqp.pyแต่ แต่หลังจากพยายามเชื่อมโยงเนื้อหาของไฟล์กับเอกสารฉันต้องยอมรับอย่างน่าเสียใจว่า Celery ไม่มีเอกสารที่น่ารังเกียจและเป็นงานที่ซับซ้อนมากอย่างน้อยก็ตัดสินด้วยซอร์สโค้ดของมัน
พฤศจิกายน

manage.pyคือสคริปต์การจัดการ Django และmanage.py celeryเรียกใช้ขึ้นฉ่ายหลังจากโหลดการกำหนดค่าจากการตั้งค่า Django ฉันไม่ได้ใช้คื่นฉ่ายนอก Django แต่celeryคำสั่งที่รวมอยู่อาจเป็นสิ่งที่คุณกำลังมองหา: celery.readthedocs.org/en/latest/userguide/monitoring.html
jwhitlock

5

ในคื่นฉ่าย 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 ()

ดังนั้นในการล้างคนงานคิวทั้งหมดจะต้องหยุด


5

หากคุณต้องการลบงานที่ค้างอยู่ทั้งหมดและงานที่กำลังดำเนินการและสำรองไว้เพื่อหยุดการขึ้นฉ่ายอย่างสมบูรณ์นี่คือสิ่งที่ฉันใช้งานได้:

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. เพื่อล้างคิวงานที่รออย่างถูกต้องคุณต้องหยุดคนงานทั้งหมด ( http://celery.readthedocs.io/en/latest/faq.html#i-ve-purged-messages-but-there-are-) ภาพนิ่งข้อความที่ยังเหลือในคิว ):

$ sudo rabbitmqctl stop

หรือ (ในกรณี RabbitMQ / นายหน้าข้อความจัดการโดยหัวหน้างาน):

$ sudo supervisorctl stop all

2. ... จากนั้นล้างงานออกจากคิวเฉพาะ:

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

3. เริ่ม RabbitMQ:

$ sudo rabbitmqctl start

หรือ (ในกรณี RabbitMQ ได้รับการจัดการโดยหัวหน้างาน):

$ sudo supervisorctl start all

2

คำสั่งcelery 4+ celery purge เพื่อล้างคิวงานที่กำหนดค่าไว้ทั้งหมด

celery -A *APPNAME* purge

โปรแกรม:

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

งานที่ค้างอยู่ทั้งหมดจะถูกลบทิ้ง อ้างอิง: celerydoc

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.