检测Celery是否可用并正在运行

时间:2014-04-05 16:09:11

标签: python django celery django-celery

我正在使用Celery和Django进行在线游戏。

基于这个答案,我已经编写了中间件来检查Celery是否可用并正在运行:Detect whether Celery is Available/Running

我的代码实际上是这样的:

from celery.task.control import inspect

class CeleryCheckMiddleware(object):

    def process_request(self, request):
        insp = inspect().stats()
        if not insp:
           return render(...)
        else:
           return None

但我忘记了答案底部评论中的警告,'我发现上面每次运行时都会向rabbitmq添加两个reply.celery.pidbox队列。这导致rabbitmq的内存使用量逐渐增加。'

我现在(仅一天之后!)注意到从insp = inspect().stats()行开始并以OSError: [Errno 4] Interrupted system call结尾偶尔会出现500个错误。

是否有内存安全的方法来检查Celery是否可用且正在运行?

2 个答案:

答案 0 :(得分:1)

这感觉非常沉重。您可能最好运行异步任务并以可接受的超时收集结果。这很天真,但它不应该对资源产生太大的影响,这取决于你需要多久调用一次......

@app.job
def celery_alive():
    return "OK"

def process_request(self, request):
    res = celery_alive.apply_async()
    try:
        return "OK" == res.get(timeout=settings.ACCEPTABLE_TRANSACTION_TIME)
    except TimeoutError as e:
        return False

答案 1 :(得分:0)

以下脚本适用于我。

#Import the celery app from project
from application_package import app as celery_app
def get_celery_worker_status():
    insp = celery_app.control.inspect()
    nodes = insp.stats()
    if not nodes:
        raise Exception("celery is not running.")
    logger.error("celery workers are: {}".format(nodes))
    return nodes