Ton*_*ada 5 django amazon-web-services celery django-celery
我有一个内存密集型的 celery 任务,我希望它在昂贵的 AWS 服务器上运行,并且该服务器大部分时间都处于关闭状态。
celerybeat 将每天安排一次任务,但也可以通过 Web 应用程序手动安排(== django)。
调度任务就是向兔子队列发送消息。
然后我想使用AWS api发出一个命令来打开我昂贵的服务器,并让它启动工作人员,等待他们在没有更多任务后死亡,然后关闭(并节省一些钱,因为服务器关闭) 。
我知道如何编写 AWS 脚本来打开我的服务器。问题是:我如何告诉 celery 运行任务直到队列为空然后死亡?
是否有我可以提供的命令参数,或者我是否需要为此想出某种技巧?
感谢@iurisilvio 和@douglas-camata 的回答。我想我利用你们的一些想法找到了一个理想的解决方案:-)
我用这个 django 命令自己创建了一个简单的监视器(毕竟我的应用程序是 django)==wait_celery_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])
Run Code Online (Sandbox Code Playgroud)
然后我通常开始芹菜过程,如下所示:./manage.py celery worker -c 1 --pidfile /tmp/celery.pid
然后我启动第二个进程(wait_and_die.sh)来监视 celery ,如果它闲置太久就会死掉。
#!/bin/bash
# wait_and_die.sh
./manage.py wait_celery_idle
kill $(cat /tmp/celery.pid)
sleep 10
sudo shutdown -h now
Run Code Online (Sandbox Code Playgroud)
PS:只有当我使用rabbit作为队列基础设施时,这才有效 -cinspect.*如果我使用django db作为队列(CELERY_BROKER_URL='django://'在settings.py中使用),则方法返回 None
| 归档时间: |
|
| 查看次数: |
2652 次 |
| 最近记录: |