【问题标题】:Getting reusable tasks to work in a setup with one celery server and 3k+ django sites, each with its own database让可重用任务在一个 celery 服务器和 3k+ django 站点的设置中工作,每个站点都有自己的数据库
【发布时间】:2011-12-21 15:44:03
【问题描述】:

问题是:我有一个 celery 服务器和 3k+ django 站点,每个站点都有自己的数据库。可以动态添加新站点(和数据库)。

我正在编写需要通过通用 celery 服务器为每个站点运行的 celery 任务。该代码位于可重复使用的应用程序中,因此不应以将其与此特定设置联系在一起的方式编写代码。

所以。在不修改任务代码以适应我的确切设置的情况下,如何确保任务在运行时连接到正确的数据库?

【问题讨论】:

  • 您如何管理 3k django 站点? 3k wsgi 服务器?还是其他魔法?
  • 目前,每个站点都有自己的 dispatch.fcgi 文件。

标签: python django celery


【解决方案1】:

由于 Django 的固有限制,这很难实现:设置是全局的。因此,除非所有应用共享相同的设置,否则这将是一个问题。

您可以尝试为每个任务生成新的工作进程,并每次都创建 django 环境。不要使用 django-celery,而是直接使用 celery 和类似这样的东西 celeryconfig.py

from celery import signals
from importlib import import_module

def before_task(task, **kwargs):
    settings_module = task.request.kwargs.pop("settings_module", None)
    if settings_module:
        settings = import_module(settings_module)
        from django.conf import setup_environ
        setup_environ(settings)
signals.task_prerun.connect(before_task)

CELERYD_MAX_TASKS_PER_CHILD = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 2010-11-25
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    相关资源
    最近更新 更多