【问题标题】:How can I automatically reload tasks modules with Celery daemon?如何使用 Celery 守护进程自动重新加载任务模块?
【发布时间】:2013-05-31 12:34:14
【问题描述】:

我正在使用 Fabric 部署一个 Celery 代理(运行 RabbitMQ)和多个 Celery 工作人员,其中 celeryd 通过 supervisor 守护进程。我一生都无法弄清楚如何重新加载 tasks.py 模块,除非重新启动服务器。


/etc/supervisor/conf.d/celeryd.conf

[program:celeryd]
directory=/fab-mrv/celeryd
environment=[RABBITMQ crendentials here]
command=xvfb-run celeryd --loglevel=INFO --autoreload
autostart=true
autorestart=true

celeryconfig.py

import os

## Broker settings
BROKER_URL = "amqp://%s:%s@hostname" % (os.environ["RMQU"], os.environ["RMQP"])

# List of modules to import when celery starts.
CELERY_IMPORTS = ("tasks", )

## Using the database to store task state and results.
CELERY_RESULT_BACKEND = "amqp"

CELERYD_POOL_RESTARTS = True

其他信息

  • celery --version 3.0.19 (Chiastic Slide)
  • python --version2.7.3
  • lsb_release -a Ubuntu 12.04.2 LTS
  • rabbitmqctl status ... 2.7.1 ...

以下是我尝试过的一些方法:

  • celeryd --autoreload 标志
  • sudo supervisorctl restart celeryd
  • celery.control.broadcast('pool_restart', arguments={'reload': True})
  • ps auxww | grep celeryd | grep -v grep | awk '{print $2}' | xargs kill -HUP

不幸的是,没有什么会导致工作人员重新加载 tasks.py 模块(例如,在运行 git pull 更新文件之后)。 相关fab功能的要点可在here查阅。

brokers/workers 在重启后运行良好。

【问题讨论】:

  • supervisorctl restart 通常对我有用。
  • 唉,不适合我。我为我的fabfile.py 添加了一个要点,并摘录了相关的 fab 函数。
  • 这里大家猜测一下,但是你有没有试过在重新加载之前删除*.pyc
  • 你试过reload函数吗?
  • 删除 *.pyc 文件,结合常用的supevisorctl 命令、-HUP 终止信号或celery.control.broadcast 不起作用。我现在让它工作,通过向两个 celerydXvfb 发送-9 终止信号,所以它似乎与无头X 服务器进程有关。 -9 信号并不完全优雅,但没有其他工作。

标签: python celery


【解决方案1】:

只是在黑暗中拍摄,使用celeryd --autoreload 选项,您确定您拥有file system notification backends 之一吗?它推荐用于 linux 的 PyNotify,所以我首先要确保你已经安装了它。

【讨论】:

  • 没有骰子。 :( Requirement already satisfied (use --upgrade to upgrade): pyinotify in /usr/local/lib/python2.7/dist-packages (版本 0.9.4)
【解决方案2】:

我遇到了类似的问题,当检测到更改时,我能够使用Watchdog 重新加载tasks.py 任务模块。安装:

pip install watchdog

您可以以编程方式使用 Watchdog API,例如,监视文件系统中的目录更改。此外,Watchdog 提供了一个可选的 shell 实用程序,称为 watchmedo,可用于在事件中执行命令。下面是一个示例,它通过 Watchdog 启动 Celery worker 并重新加载对 .py 文件的任何更改,包括通过 git pull 进行的更改:

watchmedo auto-restart --directory=./ --pattern="*.py" --recursive -- celery worker --app=worker.app --concurrency=1 --loglevel=INFO

使用 Watchdog 的 watchmedo 我能够对 git pull 进行更改,并且相应的 tasks.py 模块会自动重新加载,而无需重新启动容器或服务器。

【讨论】:

    猜你喜欢
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多