【问题标题】:Detect whether Celery is available and running检测 Celery 是否可用并正在运行
【发布时间】:2014-05-17 23:30:01
【问题描述】:

我正在使用 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 是否可用并正在运行?

【问题讨论】:

  • 您找到解决方案了吗?有没有办法刷新以前调用使用的内存?
  • @TimTisdall 不是我发现的。我坚持在更新时将网站置于维护模式,因此不会接受新任务。
  • 也许中间件会起作用...让中间件只在更新时进行检查,否则停止检查。但是,如果您是控制celery 何时关闭的人,则手动将维护屏幕打开更有意义。
  • @TimTisdall 我手动重新启动 celery 以便它可以知道任何更新的任务代码。

标签: python django celery django-celery


【解决方案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

【讨论】:

  • 感谢您的回复,但我需要检查每个请求。不管怎样,现在我已经放弃了整个想法,转而在进行各种更新时将网站置于维护模式。
  • worker 离线时是否默认使用 job.apply()?
  • 不,我正在显示整个站点的维护页面。
  • 那么对于该用例来说这将被夸大了。我可以看到用例,例如默认为通常卸载的进程内联执行(中间件添加 request.workers = True)。答案可以接受吗?
  • 不,您没有回答我的问题,即“是否有一种内存安全的方法来检查 Celery 是否可用并正在运行?”必须运行任务来检查是不可接受的。
【解决方案2】:

下面的脚本对我有用。

#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

【讨论】:

    猜你喜欢
    • 2012-01-20
    • 2016-05-23
    • 2017-01-08
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多