17

我正在使用 Fabric 部署一个 Celery 代理(运行 RabbitMQ)和多个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

芹菜配置文件

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 --version3.0.19(Chiastic Slide)
  • python --version 2.7.3
  • lsb_release -aUbuntu 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更新文件之后)。 相关晶圆厂功能的要点可在此处获得。

重新启动后,经纪人/工人运行良好。

4

2 回答 2

2

只是在黑暗中拍摄,celeryd --autoreload您是否确保您拥有一个文件系统通知后端?它推荐用于 linux 的 PyNotify,所以我首先要确保你已经安装了它。

于 2013-06-12T04:07:59.803 回答
1

我遇到了类似的问题,并且能够在检测到更改时使用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

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

于 2021-08-12T19:32:13.403 回答