Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 在没有更多任务要运行后,我如何使芹菜死亡?_Django_Amazon Web Services_Celery_Django Celery - Fatal编程技术网

Django 在没有更多任务要运行后,我如何使芹菜死亡?

Django 在没有更多任务要运行后,我如何使芹菜死亡?,django,amazon-web-services,celery,django-celery,Django,Amazon Web Services,Celery,Django Celery,我有一个芹菜任务,这是内存密集型,我希望它运行在一个昂贵的AWS服务器,大部分时间保持关闭 芹菜节拍将每天安排一次任务,但也可以通过web应用程序(=django)手动安排 调度任务就是向兔子队列发送消息 然后我想用AWS api发出一个命令,打开我昂贵的服务器,让它启动工人, 等待他们在没有更多任务后死亡,然后关机(因为服务器关闭,所以可以节省一些钱) 我知道如何编写AWS脚本以打开我的服务器。问题是:如何告诉芹菜运行任务,直到队列为空,然后死亡 是否有一个命令参数可以提供给它,或者我需要为此

我有一个芹菜任务,这是内存密集型,我希望它运行在一个昂贵的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。好的!一旦工人停止工作,什么会再次启动?我没用过芹菜酱,但看着医生,我看不出它能让人兴奋。不知为什么我错过了?