Django 在没有更多任务要运行后,我如何使芹菜死亡?
我有一个芹菜任务,这是内存密集型,我希望它运行在一个昂贵的AWS服务器,大部分时间保持关闭 芹菜节拍将每天安排一次任务,但也可以通过web应用程序(=django)手动安排 调度任务就是向兔子队列发送消息 然后我想用AWS api发出一个命令,打开我昂贵的服务器,让它启动工人, 等待他们在没有更多任务后死亡,然后关机(因为服务器关闭,所以可以节省一些钱) 我知道如何编写AWS脚本以打开我的服务器。问题是:如何告诉芹菜运行任务,直到队列为空,然后死亡Django 在没有更多任务要运行后,我如何使芹菜死亡?,django,amazon-web-services,celery,django-celery,Django,Amazon Web Services,Celery,Django Celery,我有一个芹菜任务,这是内存密集型,我希望它运行在一个昂贵的AWS服务器,大部分时间保持关闭 芹菜节拍将每天安排一次任务,但也可以通过web应用程序(=django)手动安排 调度任务就是向兔子队列发送消息 然后我想用AWS api发出一个命令,打开我昂贵的服务器,让它启动工人, 等待他们在没有更多任务后死亡,然后关机(因为服务器关闭,所以可以节省一些钱) 我知道如何编写AWS脚本以打开我的服务器。问题是:如何告诉芹菜运行任务,直到队列为空,然后死亡 是否有一个命令参数可以提供给它,或者我需要为此
是否有一个命令参数可以提供给它,或者我需要为此想出一些技巧?我的建议:创建一个回调函数,在任务完成后运行。此回调将使用AWS实例信息向web应用程序发出请求,并使用此信息将其关闭 编辑:假设您将每个任务路由到新机器中。例如,在等待销毁时,芹菜工人不应接受任何新任务
EDIT2:另外一个好主意是让这个昂贵的任务本身将请求发送到web应用程序,以销毁Amazon实例并杀死芹菜工人(请检查芹菜工人只是一匹笨马。如果工人正在等待任务,则必须有其他东西监视工人并触发事件) 用于监视芹菜簇并使用worker活动
Flower有一个漂亮的仪表盘,上面有工人/任务数据,信息在那里,他们有一个API。感谢@iurisilvio和@douglas camata的回答。我想我找到了一个理想的解决方案,利用了你们的一些想法:-) 我自己用这个django命令创建了一个简单的监视器(我的应用程序毕竟是django)==
wait\u芹菜\u idle.py
import time
from django.core.management.base import NoArgsCommand
from core.celery_utils import celery_count_status as ccount
import celery
class Command(NoArgsCommand):
help = "Waits until celery is idle"
def handle(self, *args, **options):
while _count() > 0:
time.sleep(5)
def _count():
cinspect = celery.current_app.control.inspect()
return ccount(cinspect.active()) + ccount(cinspect.scheduled()) + ccount(cinspect.reserved())
def ccount(d):
k = d.keys()[0]
return len(d[k])
然后,我正常地启动芹菜进程,如:/manage.py芹菜工人-c1--pidfile/tmp/芹菜.pid
然后,我启动第二个进程(wait_and_die.sh
)来监控芹菜,如果它闲置太长时间就会死去
#!/bin/bash
# wait_and_die.sh
./manage.py wait_celery_idle
kill $(cat /tmp/celery.pid)
sleep 10
sudo shutdown -h now
PS:这仅在我使用rabbit作为队列基础结构时有效-如果我使用django db作为队列(在settings.py中使用
CELERY\u BROKER\u URL='django://'
),则cinspect.
方法返回None)为什么要通过CELERY执行此操作?为什么不直接启动昂贵的进程,并让它在完成后简单地退出呢?该任务可能需要一段时间才能运行。当它运行请求时,可能会出现另一个类似的任务。它需要排队。只是想弄清楚:这里的意图是在不再需要服务器(为了在AWS中省钱)后关闭服务器。我不知道flower。好的!一旦工人停止工作,什么会再次启动?我没用过芹菜酱,但看着医生,我看不出它能让人兴奋。不知为什么我错过了?