【发布时间】:2019-04-02 03:42:27
【问题描述】:
我为少数客户的网站提供了一个 django 后端:
my_proj
|- my_proj
|- __init__.py
|- settings.py
|- settings_development.py
|- settings_production_1.py
|- settings_production_2.py
|- settings_production_3.py
|- my_app_1
|- my_app_2
...
settings_production_1.py:
from settings import *
DEBUG = False
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'customer_1_db',
'USER': 'some_user',
'PASSWORD': 'some_passw',
'HOST': '127.0.0.1',
'PORT': '',
}
}
MEDIA_ROOT = 'media/customer_1'
每个站点都是由 supervisord 管理的单独进程,并使用单独的数据库。另外我在单独的服务器上有一个 redis。
我需要一些具有数据库访问权限的 celery 后台任务。
我该怎么做?
更新
好的,我可以运行多个 celery worker。我可以从控制台做到这一点
$ export DJANGO_SETTINGS_MODULE=my_proj.settings_production_2
$ /home/.../my_vitrual_env/bin/celery -A my_proj worker -l info
但我无法从 supervisord 运行它
[program:celery2]
directory=/home/.../my_proj
command=/home/.../my_vitrual_env/bin/celery -A asl worker -l info
environment=DJANGO_SETTINGS_MODULE=my_proj.settings_production_2
...
【问题讨论】:
-
您可能需要为每个站点编写单独的任务,因为每个站点使用不同的数据库和所有内容。
-
单个任务文件或单个tasks.py中的单个任务?
-
个人任务。因此,您拥有的每个任务将被写入 3 次,并且在每个任务中您将指定要读取/写入的不同数据库。另一个成本效益不高的解决方案是让 3 个工作实例分别在特定的设置文件上运行。更容易实施,但两种解决方案都难以管理。
-
@devdob 如何使用特定设置文件运行工作实例?
-
Celery.py 查找名为
DJANGO_SETTINGS_MODULE的环境变量或默认为您指定的常规 settings.py 文件,查看它显示os.environ.setdefault(...)的行。因此,在每台服务器上,您都可以将此环境变量设置为您希望它运行的设置。