Browse Source

Detecting load is now lazy, and not done when importing celery.loaders.
celery.loaders.settings has been renamed to load_settings and is now a
function returning the settings, celery.loaders.current_loader is also a
function returning the current loader.

Ask Solem 15 years ago
parent
commit
3a71bdb80f

+ 3 - 1
celery/backends/mongodb.py

@@ -9,7 +9,7 @@ except ImportError:
     pymongo = None
 
 from celery.backends.base import BaseBackend
-from celery.loaders import settings
+from celery.loaders import load_settings
 from celery.conf import TASK_RESULT_EXPIRES
 
 
@@ -43,6 +43,8 @@ class MongoBackend(BaseBackend):
                 "You need to install the pymongo library to use the "
                 "MongoDB backend.")
 
+        settings = load_settings()
+
         conf = getattr(settings, "CELERY_MONGODB_BACKEND_SETTINGS", None)
         if conf is not None:
             if not isinstance(conf, dict):

+ 3 - 1
celery/backends/pyredis.py

@@ -1,7 +1,7 @@
 from django.core.exceptions import ImproperlyConfigured
 
 from celery.backends.base import KeyValueStoreBackend
-from celery.loaders import settings
+from celery.loaders import load_settings
 
 try:
     import redis
@@ -38,6 +38,8 @@ class RedisBackend(KeyValueStoreBackend):
             raise ImproperlyConfigured(
                     "You need to install the redis library in order to use "
                   + "Redis result store backend.")
+
+        settings = load_settings()
         self.redis_host = redis_host or \
                             getattr(settings, "REDIS_HOST", self.redis_host)
         self.redis_port = redis_port or \

+ 2 - 1
celery/backends/tyrant.py

@@ -6,7 +6,7 @@ except ImportError:
     pytyrant = None
 
 from celery.backends.base import KeyValueStoreBackend
-from celery.loaders import settings
+from celery.loaders import load_settings
 
 
 class TyrantBackend(KeyValueStoreBackend):
@@ -36,6 +36,7 @@ class TyrantBackend(KeyValueStoreBackend):
             raise ImproperlyConfigured(
                     "You need to install the pytyrant library to use the "
                   + "Tokyo Tyrant backend.")
+        settings = load_settings()
         self.tyrant_host = tyrant_host or \
                             getattr(settings, "TT_HOST", self.tyrant_host)
         self.tyrant_port = tyrant_port or \

+ 3 - 2
celery/bin/celeryd.py

@@ -97,7 +97,8 @@ def run_worker(concurrency=conf.CELERYD_CONCURRENCY,
 
     print("Celery %s is starting." % __version__)
 
-    from celery.loaders import Loader, current_loader, settings
+    from celery.loaders import Loader, current_loader, load_settings
+    settings = load_settings()
 
     if not concurrency:
         concurrency = multiprocessing.cpu_count()
@@ -123,7 +124,7 @@ def run_worker(concurrency=conf.CELERYD_CONCURRENCY,
 
     # Run the worker init handler.
     # (Usually imports task modules and such.)
-    current_loader.on_worker_init()
+    current_loader().on_worker_init()
 
     # Dump configuration to screen so we have some basic information
     # when users sends e-mails.

+ 3 - 1
celery/conf.py

@@ -2,7 +2,7 @@ import logging
 import warnings
 from datetime import timedelta
 
-from celery.loaders import settings
+from celery.loaders import load_settings
 
 DEFAULT_P_LOG_FMT = '[%(asctime)s: %(levelname)s/%(processName)s] %(message)s'
 DEFAULT_LOG_FMT = '[%(asctime)s: %(levelname)s] %(message)s'
@@ -11,6 +11,8 @@ LOG_LEVELS = dict(logging._levelNames)
 LOG_LEVELS["FATAL"] = logging.FATAL
 LOG_LEVELS[logging.FATAL] = "FATAL"
 
+settings = load_settings()
+
 _DEFAULTS = {
     "CELERY_BACKEND": "database",
     "CELERY_ALWAYS_EAGER": False,

+ 14 - 21
celery/loaders/__init__.py

@@ -9,6 +9,8 @@ LOADER_CLASS_NAME = "Loader"
 LOADER_ALIASES = {"django": "celery.loaders.djangoapp",
                   "default": "celery.loaders.default"}
 _loader_cache = {}
+_loader = None
+_settings = None
 
 
 def resolve_loader(loader):
@@ -74,27 +76,18 @@ def _detect_loader(): # pragma: no cover
 
     return DefaultLoader
 
-"""
-.. class:: Loader
 
-The current loader class.
+def current_loader():
+    """Detect and return the current loader."""
+    global _loader
+    if _loader is None:
+        _loader = _detect_loader()()
+    return _loader
 
-"""
-Loader = detect_loader()
 
-"""
-.. data:: current_loader
-
-The current loader instance.
-
-"""
-current_loader = Loader()
-
-
-"""
-.. data:: settings
-
-The global settings object.
-
-"""
-settings = current_loader.conf
+def load_settings():
+    """Load the global settings object."""
+    global _settings
+    if _settings is None:
+        _settings = current_loader().conf
+    return _settings

+ 1 - 1
celery/worker/job.py

@@ -69,7 +69,7 @@ class WorkerTaskTrace(TaskTrace):
     """
 
     def __init__(self, *args, **kwargs):
-        self.loader = kwargs.pop("loader", current_loader)
+        self.loader = kwargs.pop("loader", current_loader())
         super(WorkerTaskTrace, self).__init__(*args, **kwargs)
 
         self._store_errors = True