在没有更多任务可运行后,如何让 celery 死掉?

Ton*_*ada 5 django amazon-web-services celery django-celery

我有一个内存密集型的 celery 任务,我希望它在昂贵的 AWS 服务器上运行,并且该服务器大部分时间都处于关闭状态。

celerybeat 将每天安排一次任务,但也可以通过 Web 应用程序手动安排(== django)。

调度任务就是向兔子队列发送消息。

然后我想使用AWS api发出一个命令来打开我昂贵的服务器,并让它启动工作人员,等待他们在没有更多任务后死亡,然后关闭(并节省一些钱,因为服务器关闭) 。

我知道如何编写 AWS 脚本来打开我的服务器。问题是:我如何告诉 celery 运行任务直到队列为空然后死亡

是否有我可以提供的命令参数,或者我是否需要为此想出某种技巧?

Ton*_*ada 2

感谢@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